itd-api 0.9.2 → 0.10.0
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 +9 -8
- package/dist/events/index.cjs +2 -2
- package/dist/events/index.d.cts +2 -2
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.js +2 -2
- package/dist/index.cjs +489 -92
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +186 -36
- package/dist/index.d.ts +186 -36
- package/dist/index.js +485 -94
- package/dist/index.js.map +1 -1
- package/dist/rest/index.cjs +2 -2
- package/dist/rest/index.d.cts +2 -2
- package/dist/rest/index.d.ts +2 -2
- package/dist/rest/index.js +2 -2
- package/dist/shared/{events-BIBO2Jif.js → events-B0Wtn4cF.js} +3 -3
- package/dist/shared/{events-BIBO2Jif.js.map → events-B0Wtn4cF.js.map} +1 -1
- package/dist/shared/{events-BsRm_Fba.cjs → events-BB791aPk.cjs} +8 -2
- package/dist/shared/{events-BsRm_Fba.cjs.map → events-BB791aPk.cjs.map} +1 -1
- package/dist/shared/{events-BCn5LRnT.d.cts → events-BNGjJVI3.d.cts} +2 -2
- package/dist/shared/{events-t1uGgpkf.d.ts → events-CJO6q93Z.d.ts} +2 -2
- package/dist/shared/{render-DqVzx68r.cjs → render-BimHjOhw.cjs} +2 -30
- package/dist/shared/render-BimHjOhw.cjs.map +1 -0
- package/dist/shared/{render-DA83gS0f.d.cts → render-C1A57W-5.d.cts} +2 -14
- package/dist/shared/{render--ZXmYEf-.js → render-CkhvH_yh.js} +2 -30
- package/dist/shared/render-CkhvH_yh.js.map +1 -0
- package/dist/shared/{render-BdnBV-aT.d.ts → render-DC5nvqcP.d.ts} +2 -14
- package/dist/shared/{url-i2f-X1hX.js → url-BA5hEwj2.js} +95 -16
- package/dist/shared/url-BA5hEwj2.js.map +1 -0
- package/dist/shared/{url-Doc0XXW_.cjs → url-CDVgMIq5.cjs} +130 -15
- package/dist/shared/url-CDVgMIq5.cjs.map +1 -0
- package/dist/shared/{url-Dbj6V6fk.d.cts → url-DkMueFAT.d.cts} +76 -17
- package/dist/shared/{url-Dbj6V6fk.d.ts → url-DkMueFAT.d.ts} +76 -17
- package/package.json +4 -3
- package/dist/shared/render--ZXmYEf-.js.map +0 -1
- package/dist/shared/render-DqVzx68r.cjs.map +0 -1
- package/dist/shared/url-Doc0XXW_.cjs.map +0 -1
- package/dist/shared/url-i2f-X1hX.js.map +0 -1
|
@@ -85,7 +85,7 @@ function requireOptionalBoolean(value, name) {
|
|
|
85
85
|
//#endregion
|
|
86
86
|
//#region src/core/version.ts
|
|
87
87
|
/** Версия библиотеки. Попадает в `User-Agent`. */
|
|
88
|
-
const LIBRARY_VERSION = "0.
|
|
88
|
+
const LIBRARY_VERSION = "0.10.0";
|
|
89
89
|
//#endregion
|
|
90
90
|
//#region src/core/config.ts
|
|
91
91
|
/** Базовый URL API итд.com. Домен записан в punycode: `итд.com`. */
|
|
@@ -1364,7 +1364,10 @@ function requestAuthRecoveryState(request) {
|
|
|
1364
1364
|
const internal = request;
|
|
1365
1365
|
const current = internal[REQUEST_AUTH_RECOVERY_STATE];
|
|
1366
1366
|
if (current) return current;
|
|
1367
|
-
const state = {
|
|
1367
|
+
const state = {
|
|
1368
|
+
recovered: false,
|
|
1369
|
+
preparationErrors: /* @__PURE__ */ new Set()
|
|
1370
|
+
};
|
|
1368
1371
|
internal[REQUEST_AUTH_RECOVERY_STATE] = state;
|
|
1369
1372
|
return state;
|
|
1370
1373
|
}
|
|
@@ -1802,6 +1805,19 @@ function createServicesMiddleware(registry) {
|
|
|
1802
1805
|
return next(prepared);
|
|
1803
1806
|
};
|
|
1804
1807
|
}
|
|
1808
|
+
/** Однократная auth-подготовка вне retry исходного запроса. */
|
|
1809
|
+
function createAuthPreflightMiddleware(getAuth) {
|
|
1810
|
+
return async (request, next) => {
|
|
1811
|
+
if (!request.skipAuth) {
|
|
1812
|
+
const auth = getAuth();
|
|
1813
|
+
if (auth.preflight) {
|
|
1814
|
+
const pending = auth.preflight(request.skipAuthRefresh !== true);
|
|
1815
|
+
await (request.signal ? waitForRequest(pending, request.signal) : pending);
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
return next(request);
|
|
1819
|
+
};
|
|
1820
|
+
}
|
|
1805
1821
|
/**
|
|
1806
1822
|
* Подготавливает auth state до входа транспортной попытки в очередь.
|
|
1807
1823
|
*
|
|
@@ -1812,7 +1828,12 @@ function createAuthPreparationMiddleware(auth) {
|
|
|
1812
1828
|
return async (request, next) => {
|
|
1813
1829
|
if (!request.skipAuth) {
|
|
1814
1830
|
const pending = auth.prepare();
|
|
1815
|
-
|
|
1831
|
+
try {
|
|
1832
|
+
await (request.signal ? waitForRequest(pending, request.signal) : pending);
|
|
1833
|
+
} catch (error) {
|
|
1834
|
+
requestAuthRecoveryState(request).preparationErrors.add(error);
|
|
1835
|
+
throw error;
|
|
1836
|
+
}
|
|
1816
1837
|
}
|
|
1817
1838
|
return next(request);
|
|
1818
1839
|
};
|
|
@@ -1852,7 +1873,8 @@ function createAuthRecoveryMiddleware(auth) {
|
|
|
1852
1873
|
try {
|
|
1853
1874
|
return await next(request);
|
|
1854
1875
|
} catch (error) {
|
|
1855
|
-
|
|
1876
|
+
const preparationFailed = recovery.preparationErrors.delete(error);
|
|
1877
|
+
if (request.skipAuthRefresh || recovery.recovered || preparationFailed || !require_errors.isItdApiError(error) || error.status !== 401) throw error;
|
|
1856
1878
|
const pending = auth.recover();
|
|
1857
1879
|
if (!await (request.signal ? waitForRequest(pending, request.signal) : pending)) throw error;
|
|
1858
1880
|
recovery.recovered = true;
|
|
@@ -2581,6 +2603,7 @@ var Transport = class {
|
|
|
2581
2603
|
const ClientRuntimeStage = Object.freeze({
|
|
2582
2604
|
OperationPlugins: "operation_plugins",
|
|
2583
2605
|
Services: "services",
|
|
2606
|
+
AuthPreflight: "auth_preflight",
|
|
2584
2607
|
Retry: "retry",
|
|
2585
2608
|
AuthRecovery: "auth_recovery",
|
|
2586
2609
|
AuthPreparation: "auth_preparation",
|
|
@@ -2656,6 +2679,10 @@ function createClientRuntime(options, internals) {
|
|
|
2656
2679
|
name: ClientRuntimeStage.Services,
|
|
2657
2680
|
middleware: createServicesMiddleware(services)
|
|
2658
2681
|
},
|
|
2682
|
+
{
|
|
2683
|
+
name: ClientRuntimeStage.AuthPreflight,
|
|
2684
|
+
middleware: createAuthPreflightMiddleware(() => auth)
|
|
2685
|
+
},
|
|
2659
2686
|
{
|
|
2660
2687
|
name: ClientRuntimeStage.Retry,
|
|
2661
2688
|
middleware: createRetryMiddleware({
|
|
@@ -2740,6 +2767,8 @@ function createClientRuntime(options, internals) {
|
|
|
2740
2767
|
fetch: config.fetch,
|
|
2741
2768
|
clock: config.clock,
|
|
2742
2769
|
logger: config.logger,
|
|
2770
|
+
signal: lifetime.signal,
|
|
2771
|
+
assertActive: (action) => internals.assertActive?.(action),
|
|
2743
2772
|
baseHeaders: async (url) => {
|
|
2744
2773
|
const headers = await transport.platformHeaders(url);
|
|
2745
2774
|
for (const [name, value] of Object.entries(service?.headers ?? {})) headers.set(name, value);
|
|
@@ -2784,6 +2813,8 @@ const BUCKET_LIMITS = Object.freeze({
|
|
|
2784
2813
|
"files.get": 40,
|
|
2785
2814
|
auth: 35,
|
|
2786
2815
|
"auth.refresh": 25,
|
|
2816
|
+
"auth.qrStart": 40,
|
|
2817
|
+
"auth.qrClaim": 300,
|
|
2787
2818
|
search: 25,
|
|
2788
2819
|
"comments.like": 22,
|
|
2789
2820
|
"files.upload": 15,
|
|
@@ -2837,6 +2868,11 @@ const OPERATIONS = freezeOperations({
|
|
|
2837
2868
|
method: "GET",
|
|
2838
2869
|
retrySafety: RetrySafety.Safe
|
|
2839
2870
|
},
|
|
2871
|
+
"auth.captchaProvider": {
|
|
2872
|
+
method: "GET",
|
|
2873
|
+
retrySafety: RetrySafety.Safe,
|
|
2874
|
+
bucket: "auth"
|
|
2875
|
+
},
|
|
2840
2876
|
"auth.signUp": {
|
|
2841
2877
|
method: "POST",
|
|
2842
2878
|
retrySafety: RetrySafety.Unsafe,
|
|
@@ -2897,6 +2933,16 @@ const OPERATIONS = freezeOperations({
|
|
|
2897
2933
|
retrySafety: RetrySafety.Unsafe,
|
|
2898
2934
|
bucket: "auth"
|
|
2899
2935
|
},
|
|
2936
|
+
"auth.qrStart": {
|
|
2937
|
+
method: "POST",
|
|
2938
|
+
retrySafety: RetrySafety.Unsafe,
|
|
2939
|
+
bucket: "auth.qrStart"
|
|
2940
|
+
},
|
|
2941
|
+
"auth.qrClaim": {
|
|
2942
|
+
method: "POST",
|
|
2943
|
+
retrySafety: RetrySafety.Unsafe,
|
|
2944
|
+
bucket: "auth.qrClaim"
|
|
2945
|
+
},
|
|
2900
2946
|
"users.me": {
|
|
2901
2947
|
method: "GET",
|
|
2902
2948
|
retrySafety: RetrySafety.Safe,
|
|
@@ -2929,11 +2975,6 @@ const OPERATIONS = freezeOperations({
|
|
|
2929
2975
|
retrySafety: RetrySafety.Safe,
|
|
2930
2976
|
bucket: "users"
|
|
2931
2977
|
},
|
|
2932
|
-
"users.search": {
|
|
2933
|
-
method: "GET",
|
|
2934
|
-
retrySafety: RetrySafety.Safe,
|
|
2935
|
-
bucket: "users"
|
|
2936
|
-
},
|
|
2937
2978
|
"users.whoToFollow": {
|
|
2938
2979
|
method: "GET",
|
|
2939
2980
|
retrySafety: RetrySafety.Safe,
|
|
@@ -3170,11 +3211,6 @@ const OPERATIONS = freezeOperations({
|
|
|
3170
3211
|
retrySafety: RetrySafety.Safe,
|
|
3171
3212
|
bucket: "notifications"
|
|
3172
3213
|
},
|
|
3173
|
-
"hashtags.search": {
|
|
3174
|
-
method: "GET",
|
|
3175
|
-
retrySafety: RetrySafety.Safe,
|
|
3176
|
-
bucket: "hashtags"
|
|
3177
|
-
},
|
|
3178
3214
|
"hashtags.trending": {
|
|
3179
3215
|
method: "GET",
|
|
3180
3216
|
retrySafety: RetrySafety.Safe,
|
|
@@ -3446,6 +3482,41 @@ const ReportReason = Object.freeze({
|
|
|
3446
3482
|
Fraud: "fraud",
|
|
3447
3483
|
Other: "other"
|
|
3448
3484
|
});
|
|
3485
|
+
/**
|
|
3486
|
+
* Провайдер капчи, которую сервер требует пройти при входе. Тип открытый.
|
|
3487
|
+
*
|
|
3488
|
+
* Активного сообщает `itd.auth.captchaProvider()`.
|
|
3489
|
+
*/
|
|
3490
|
+
const CaptchaType = Object.freeze({
|
|
3491
|
+
/** Собственная капча ИТД. */
|
|
3492
|
+
Itd: "itd",
|
|
3493
|
+
/** Cloudflare Turnstile. */
|
|
3494
|
+
Cloudflare: "cloudflare"
|
|
3495
|
+
});
|
|
3496
|
+
/**
|
|
3497
|
+
* Какую капчу решать при входе по логину и паролю.
|
|
3498
|
+
*
|
|
3499
|
+
* `CaptchaChoice.Auto` — спросить сервер перед каждым входом; названный провайдер
|
|
3500
|
+
* решается без этого запроса.
|
|
3501
|
+
*/
|
|
3502
|
+
const CaptchaChoice = Object.freeze({
|
|
3503
|
+
/** Провайдера называет сервер. */
|
|
3504
|
+
Auto: "auto",
|
|
3505
|
+
Itd: CaptchaType.Itd,
|
|
3506
|
+
Cloudflare: CaptchaType.Cloudflare
|
|
3507
|
+
});
|
|
3508
|
+
/**
|
|
3509
|
+
* Поле тела запроса, в котором сервер ждёт токен капчи. Тип открытый.
|
|
3510
|
+
*
|
|
3511
|
+
* При `CaptchaChoice.Auto` имя берётся из ответа сервера; эти значения — умолчания
|
|
3512
|
+
* для явно выбранного провайдера.
|
|
3513
|
+
*/
|
|
3514
|
+
const CaptchaField = Object.freeze({
|
|
3515
|
+
/** Поле собственной капчи ИТД. */
|
|
3516
|
+
Itd: "token",
|
|
3517
|
+
/** Поле Cloudflare Turnstile. */
|
|
3518
|
+
Cloudflare: "turnstileToken"
|
|
3519
|
+
});
|
|
3449
3520
|
/** Состояние соединения событийного канала. */
|
|
3450
3521
|
const EventChannelStatus = Object.freeze({
|
|
3451
3522
|
Connecting: "connecting",
|
|
@@ -3599,6 +3670,8 @@ const ItdErrorCode = Object.freeze({
|
|
|
3599
3670
|
CAPTCHA_FAILED: "CAPTCHA_FAILED",
|
|
3600
3671
|
/** Капча не пройдена: токен Turnstile недействителен, просрочен или уже использован. */
|
|
3601
3672
|
TURNSTILE_VERIFICATION_FAILED: "TURNSTILE_VERIFICATION_FAILED",
|
|
3673
|
+
/** Собственная captcha ИТД не подтвердила целостность проверки. */
|
|
3674
|
+
INTEGRITY_CHECK_FAILED: "INTEGRITY_CHECK_FAILED",
|
|
3602
3675
|
OTP_INVALID: "OTP_INVALID",
|
|
3603
3676
|
/** `flowToken` неизвестен или просрочен — поток подтверждения нужно начинать заново. */
|
|
3604
3677
|
INVALID_FLOW_TOKEN: "INVALID_FLOW_TOKEN",
|
|
@@ -3615,6 +3688,12 @@ const ItdErrorCode = Object.freeze({
|
|
|
3615
3688
|
/** Cookie `refresh_token` есть, но сессии за ней уже нет: отозвана или истекла. */
|
|
3616
3689
|
SESSION_NOT_FOUND: "SESSION_NOT_FOUND",
|
|
3617
3690
|
MISSING_FLOW_TOKEN: "MISSING_FLOW_TOKEN",
|
|
3691
|
+
QR_EXPIRED: "QR_EXPIRED",
|
|
3692
|
+
QR_TOKEN_MISMATCH: "QR_TOKEN_MISMATCH",
|
|
3693
|
+
QR_ALREADY_USED: "QR_ALREADY_USED",
|
|
3694
|
+
QR_NOT_SCANNED: "QR_NOT_SCANNED",
|
|
3695
|
+
USER_INACTIVE: "USER_INACTIVE",
|
|
3696
|
+
TOO_MANY_REQUESTS: "TOO_MANY_REQUESTS",
|
|
3618
3697
|
PROFILE_USERNAME_TAKEN: "PROFILE_USERNAME_TAKEN",
|
|
3619
3698
|
PROFILE_USERNAME_RESERVED: "PROFILE_USERNAME_RESERVED",
|
|
3620
3699
|
PROFILE_RESTRICTION_ACTIVE: "PROFILE_RESTRICTION_ACTIVE",
|
|
@@ -4013,6 +4092,24 @@ Object.defineProperty(exports, "BUCKET_LIMITS", {
|
|
|
4013
4092
|
return BUCKET_LIMITS;
|
|
4014
4093
|
}
|
|
4015
4094
|
});
|
|
4095
|
+
Object.defineProperty(exports, "CaptchaChoice", {
|
|
4096
|
+
enumerable: true,
|
|
4097
|
+
get: function() {
|
|
4098
|
+
return CaptchaChoice;
|
|
4099
|
+
}
|
|
4100
|
+
});
|
|
4101
|
+
Object.defineProperty(exports, "CaptchaField", {
|
|
4102
|
+
enumerable: true,
|
|
4103
|
+
get: function() {
|
|
4104
|
+
return CaptchaField;
|
|
4105
|
+
}
|
|
4106
|
+
});
|
|
4107
|
+
Object.defineProperty(exports, "CaptchaType", {
|
|
4108
|
+
enumerable: true,
|
|
4109
|
+
get: function() {
|
|
4110
|
+
return CaptchaType;
|
|
4111
|
+
}
|
|
4112
|
+
});
|
|
4016
4113
|
Object.defineProperty(exports, "CommentSort", {
|
|
4017
4114
|
enumerable: true,
|
|
4018
4115
|
get: function() {
|
|
@@ -4187,6 +4284,12 @@ Object.defineProperty(exports, "canonicalNotificationType", {
|
|
|
4187
4284
|
return canonicalNotificationType;
|
|
4188
4285
|
}
|
|
4189
4286
|
});
|
|
4287
|
+
Object.defineProperty(exports, "createApiError", {
|
|
4288
|
+
enumerable: true,
|
|
4289
|
+
get: function() {
|
|
4290
|
+
return createApiError;
|
|
4291
|
+
}
|
|
4292
|
+
});
|
|
4190
4293
|
Object.defineProperty(exports, "createClientRuntime", {
|
|
4191
4294
|
enumerable: true,
|
|
4192
4295
|
get: function() {
|
|
@@ -4199,6 +4302,12 @@ Object.defineProperty(exports, "createDeadline", {
|
|
|
4199
4302
|
return createDeadline;
|
|
4200
4303
|
}
|
|
4201
4304
|
});
|
|
4305
|
+
Object.defineProperty(exports, "createRequestAbortScope", {
|
|
4306
|
+
enumerable: true,
|
|
4307
|
+
get: function() {
|
|
4308
|
+
return createRequestAbortScope;
|
|
4309
|
+
}
|
|
4310
|
+
});
|
|
4202
4311
|
Object.defineProperty(exports, "defineBuiltInOperation", {
|
|
4203
4312
|
enumerable: true,
|
|
4204
4313
|
get: function() {
|
|
@@ -4337,6 +4446,12 @@ Object.defineProperty(exports, "readUnreadCountEvent", {
|
|
|
4337
4446
|
return readUnreadCountEvent;
|
|
4338
4447
|
}
|
|
4339
4448
|
});
|
|
4449
|
+
Object.defineProperty(exports, "requestAbortError", {
|
|
4450
|
+
enumerable: true,
|
|
4451
|
+
get: function() {
|
|
4452
|
+
return requestAbortError;
|
|
4453
|
+
}
|
|
4454
|
+
});
|
|
4340
4455
|
Object.defineProperty(exports, "requireOptionalBoolean", {
|
|
4341
4456
|
enumerable: true,
|
|
4342
4457
|
get: function() {
|
|
@@ -4380,4 +4495,4 @@ Object.defineProperty(exports, "voidResult", {
|
|
|
4380
4495
|
}
|
|
4381
4496
|
});
|
|
4382
4497
|
|
|
4383
|
-
//# sourceMappingURL=url-
|
|
4498
|
+
//# sourceMappingURL=url-CDVgMIq5.cjs.map
|