@ybgnb/bili-api 0.0.1 → 0.0.2
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/dist/api/base.d.ts +35 -0
- package/dist/api/base.d.ts.map +1 -0
- package/dist/api/base.js +184 -0
- package/dist/api/base.js.map +1 -0
- package/dist/api/page/page.d.ts +35 -0
- package/dist/api/page/page.d.ts.map +1 -0
- package/dist/api/page/page.js +102 -0
- package/dist/api/page/page.js.map +1 -0
- package/dist/api/page/strategies/base.d.ts +30 -0
- package/dist/api/page/strategies/base.d.ts.map +1 -0
- package/dist/api/page/strategies/base.js +9 -0
- package/dist/api/page/strategies/base.js.map +1 -0
- package/dist/api/page/strategies/has-more.d.ts +15 -0
- package/dist/api/page/strategies/has-more.d.ts.map +1 -0
- package/dist/api/page/strategies/has-more.js +26 -0
- package/dist/api/page/strategies/has-more.js.map +1 -0
- package/dist/api/page/strategies/list.d.ts +12 -0
- package/dist/api/page/strategies/list.d.ts.map +1 -0
- package/dist/api/page/strategies/list.js +31 -0
- package/dist/api/page/strategies/list.js.map +1 -0
- package/dist/api/page/strategies/total.d.ts +12 -0
- package/dist/api/page/strategies/total.d.ts.map +1 -0
- package/dist/api/page/strategies/total.js +33 -0
- package/dist/api/page/strategies/total.js.map +1 -0
- package/dist/api/with-api.d.ts +18 -0
- package/dist/api/with-api.d.ts.map +1 -0
- package/dist/api/with-api.js +32 -0
- package/dist/api/with-api.js.map +1 -0
- package/dist/client/client.d.ts +66 -4
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +31 -5
- package/dist/client/client.js.map +1 -1
- package/dist/config/{index.d.ts → config.d.ts} +7 -3
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/{index.js → config.js} +7 -2
- package/dist/config/config.js.map +1 -0
- package/dist/error/{index.d.ts → error.d.ts} +8 -8
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/{index.js → error.js} +3 -3
- package/dist/error/error.js.map +1 -0
- package/dist/index.d.ts +70 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -6
- package/dist/index.js.map +1 -1
- package/dist/service/archive/archive.d.ts +13 -0
- package/dist/service/archive/archive.d.ts.map +1 -0
- package/dist/service/archive/archive.js +71 -0
- package/dist/service/archive/archive.js.map +1 -0
- package/dist/service/bangumi/follow.d.ts +57 -0
- package/dist/service/bangumi/follow.d.ts.map +1 -0
- package/dist/service/bangumi/follow.js +154 -0
- package/dist/service/bangumi/follow.js.map +1 -0
- package/dist/service/base.d.ts +5 -7
- package/dist/service/base.d.ts.map +1 -1
- package/dist/service/base.js +7 -14
- package/dist/service/base.js.map +1 -1
- package/dist/service/fav/collection.d.ts +45 -0
- package/dist/service/fav/collection.d.ts.map +1 -0
- package/dist/service/fav/collection.js +134 -0
- package/dist/service/fav/collection.js.map +1 -0
- package/dist/service/fav/fav.d.ts +118 -0
- package/dist/service/fav/fav.d.ts.map +1 -0
- package/dist/service/fav/fav.js +319 -0
- package/dist/service/fav/fav.js.map +1 -0
- package/dist/service/fav/helper.d.ts +10 -0
- package/dist/service/fav/helper.d.ts.map +1 -0
- package/dist/service/fav/helper.js +29 -0
- package/dist/service/fav/helper.js.map +1 -0
- package/dist/service/fav/opus.d.ts +48 -0
- package/dist/service/fav/opus.d.ts.map +1 -0
- package/dist/service/fav/opus.js +160 -0
- package/dist/service/fav/opus.js.map +1 -0
- package/dist/service/fav/page/opus.d.ts +15 -0
- package/dist/service/fav/page/opus.d.ts.map +1 -0
- package/dist/service/fav/page/opus.js +24 -0
- package/dist/service/fav/page/opus.js.map +1 -0
- package/dist/service/history/history.d.ts +48 -0
- package/dist/service/history/history.d.ts.map +1 -0
- package/dist/service/history/history.js +139 -0
- package/dist/service/history/history.js.map +1 -0
- package/dist/service/history/page.d.ts +14 -0
- package/dist/service/history/page.d.ts.map +1 -0
- package/dist/service/history/page.js +40 -0
- package/dist/service/history/page.js.map +1 -0
- package/dist/service/message/message.d.ts +137 -0
- package/dist/service/message/message.d.ts.map +1 -0
- package/dist/service/message/message.js +328 -0
- package/dist/service/message/message.js.map +1 -0
- package/dist/service/message/page/at.d.ts +15 -0
- package/dist/service/message/page/at.d.ts.map +1 -0
- package/dist/service/message/page/at.js +34 -0
- package/dist/service/message/page/at.js.map +1 -0
- package/dist/service/message/page/like.d.ts +15 -0
- package/dist/service/message/page/like.d.ts.map +1 -0
- package/dist/service/message/page/like.js +34 -0
- package/dist/service/message/page/like.js.map +1 -0
- package/dist/service/message/page/reply.d.ts +15 -0
- package/dist/service/message/page/reply.d.ts.map +1 -0
- package/dist/service/message/page/reply.js +34 -0
- package/dist/service/message/page/reply.js.map +1 -0
- package/dist/service/message/page/system.d.ts +15 -0
- package/dist/service/message/page/system.d.ts.map +1 -0
- package/dist/service/message/page/system.js +33 -0
- package/dist/service/message/page/system.js.map +1 -0
- package/dist/service/relation/relation.d.ts +190 -0
- package/dist/service/relation/relation.d.ts.map +1 -0
- package/dist/service/relation/relation.js +481 -0
- package/dist/service/relation/relation.js.map +1 -0
- package/dist/service/session/page.d.ts +16 -0
- package/dist/service/session/page.d.ts.map +1 -0
- package/dist/service/session/page.js +35 -0
- package/dist/service/session/page.js.map +1 -0
- package/dist/service/session/session.d.ts +48 -0
- package/dist/service/session/session.d.ts.map +1 -0
- package/dist/service/session/session.js +167 -0
- package/dist/service/session/session.js.map +1 -0
- package/dist/service/session/settings.d.ts +56 -0
- package/dist/service/session/settings.d.ts.map +1 -0
- package/dist/service/session/settings.js +219 -0
- package/dist/service/session/settings.js.map +1 -0
- package/dist/service/space/archive.d.ts +34 -0
- package/dist/service/space/archive.d.ts.map +1 -0
- package/dist/service/space/archive.js +102 -0
- package/dist/service/space/archive.js.map +1 -0
- package/dist/service/space/page/search.d.ts +16 -0
- package/dist/service/space/page/search.d.ts.map +1 -0
- package/dist/service/space/page/search.js +33 -0
- package/dist/service/space/page/search.js.map +1 -0
- package/dist/service/toview/page.d.ts +15 -0
- package/dist/service/toview/page.d.ts.map +1 -0
- package/dist/service/toview/page.js +31 -0
- package/dist/service/toview/page.js.map +1 -0
- package/dist/service/toview/toview.d.ts +56 -0
- package/dist/service/toview/toview.d.ts.map +1 -0
- package/dist/service/toview/toview.js +177 -0
- package/dist/service/toview/toview.js.map +1 -0
- package/dist/service/user/qrcode-login.d.ts +2 -2
- package/dist/service/user/qrcode-login.d.ts.map +1 -1
- package/dist/service/user/qrcode-login.js +4 -4
- package/dist/service/user/qrcode-login.js.map +1 -1
- package/dist/service/user/user.d.ts +34 -0
- package/dist/service/user/user.d.ts.map +1 -0
- package/dist/service/user/{index.js → user.js} +38 -23
- package/dist/service/user/user.js.map +1 -0
- package/dist/stores/mixinkey.d.ts +1 -0
- package/dist/stores/mixinkey.d.ts.map +1 -1
- package/dist/stores/mixinkey.js +2 -2
- package/dist/stores/mixinkey.js.map +1 -1
- package/dist/types/core/client.d.ts +6 -1
- package/dist/types/core/client.d.ts.map +1 -1
- package/dist/types/core/client.js +1 -1
- package/dist/types/core/client.js.map +1 -1
- package/dist/types/core/page.d.ts +43 -0
- package/dist/types/core/page.d.ts.map +1 -0
- package/dist/types/core/page.js +2 -0
- package/dist/types/core/page.js.map +1 -0
- package/dist/types/core/request.d.ts +26 -7
- package/dist/types/core/request.d.ts.map +1 -1
- package/dist/types/core/request.js +1 -0
- package/dist/types/core/request.js.map +1 -1
- package/dist/types/core/type-helpers.d.ts +12 -0
- package/dist/types/core/type-helpers.d.ts.map +1 -0
- package/dist/types/core/type-helpers.js +7 -0
- package/dist/types/core/type-helpers.js.map +1 -0
- package/dist/types/modules/archive/part.d.ts +31 -0
- package/dist/types/modules/archive/part.d.ts.map +1 -0
- package/dist/types/modules/archive/part.js +2 -0
- package/dist/types/modules/archive/part.js.map +1 -0
- package/dist/types/modules/bangumi/bangumi.d.ts +64 -0
- package/dist/types/modules/bangumi/bangumi.d.ts.map +1 -0
- package/dist/types/modules/bangumi/bangumi.js +29 -0
- package/dist/types/modules/bangumi/bangumi.js.map +1 -0
- package/dist/types/modules/business/business.d.ts +41 -0
- package/dist/types/modules/business/business.d.ts.map +1 -0
- package/dist/types/modules/business/business.js +31 -0
- package/dist/types/modules/business/business.js.map +1 -0
- package/dist/types/modules/device/device.d.ts +15 -0
- package/dist/types/modules/device/device.d.ts.map +1 -0
- package/dist/types/modules/device/device.js +11 -0
- package/dist/types/modules/device/device.js.map +1 -0
- package/dist/types/modules/fav/collection.d.ts +24 -0
- package/dist/types/modules/fav/collection.d.ts.map +1 -0
- package/dist/types/modules/fav/collection.js +2 -0
- package/dist/types/modules/fav/collection.js.map +1 -0
- package/dist/types/modules/fav/fav.d.ts +104 -0
- package/dist/types/modules/fav/fav.d.ts.map +1 -0
- package/dist/types/modules/fav/fav.js +2 -0
- package/dist/types/modules/fav/fav.js.map +1 -0
- package/dist/types/modules/fav/folder.d.ts +61 -0
- package/dist/types/modules/fav/folder.d.ts.map +1 -0
- package/dist/types/modules/fav/folder.js +2 -0
- package/dist/types/modules/fav/folder.js.map +1 -0
- package/dist/types/modules/fav/opus.d.ts +31 -0
- package/dist/types/modules/fav/opus.d.ts.map +1 -0
- package/dist/types/modules/fav/opus.js +2 -0
- package/dist/types/modules/fav/opus.js.map +1 -0
- package/dist/types/modules/history/history.d.ts +111 -0
- package/dist/types/modules/history/history.d.ts.map +1 -0
- package/dist/types/modules/history/history.js +2 -0
- package/dist/types/modules/history/history.js.map +1 -0
- package/dist/types/modules/message/at.d.ts +46 -0
- package/dist/types/modules/message/at.d.ts.map +1 -0
- package/dist/types/modules/message/at.js +2 -0
- package/dist/types/modules/message/at.js.map +1 -0
- package/dist/types/modules/message/business.d.ts +56 -0
- package/dist/types/modules/message/business.d.ts.map +1 -0
- package/dist/types/modules/message/business.js +43 -0
- package/dist/types/modules/message/business.js.map +1 -0
- package/dist/types/modules/message/like.d.ts +53 -0
- package/dist/types/modules/message/like.d.ts.map +1 -0
- package/dist/types/modules/message/like.js +2 -0
- package/dist/types/modules/message/like.js.map +1 -0
- package/dist/types/modules/message/message.d.ts +75 -0
- package/dist/types/modules/message/message.d.ts.map +1 -0
- package/dist/types/modules/message/message.js +2 -0
- package/dist/types/modules/message/message.js.map +1 -0
- package/dist/types/modules/message/reply.d.ts +59 -0
- package/dist/types/modules/message/reply.d.ts.map +1 -0
- package/dist/types/modules/message/reply.js +2 -0
- package/dist/types/modules/message/reply.js.map +1 -0
- package/dist/types/modules/message/settings.d.ts +172 -0
- package/dist/types/modules/message/settings.d.ts.map +1 -0
- package/dist/types/modules/message/settings.js +14 -0
- package/dist/types/modules/message/settings.js.map +1 -0
- package/dist/types/modules/message/system.d.ts +45 -0
- package/dist/types/modules/message/system.d.ts.map +1 -0
- package/dist/types/modules/message/system.js +2 -0
- package/dist/types/modules/message/system.js.map +1 -0
- package/dist/types/modules/misc.d.ts.map +1 -0
- package/dist/types/{business → modules}/misc.js.map +1 -1
- package/dist/types/modules/opus/opus.d.ts +10 -0
- package/dist/types/modules/opus/opus.d.ts.map +1 -0
- package/dist/types/modules/opus/opus.js +2 -0
- package/dist/types/modules/opus/opus.js.map +1 -0
- package/dist/types/modules/session/session.d.ts +133 -0
- package/dist/types/modules/session/session.d.ts.map +1 -0
- package/dist/types/modules/session/session.js +2 -0
- package/dist/types/modules/session/session.js.map +1 -0
- package/dist/types/modules/session/source.d.ts +107 -0
- package/dist/types/modules/session/source.d.ts.map +1 -0
- package/dist/types/modules/session/source.js +96 -0
- package/dist/types/modules/session/source.js.map +1 -0
- package/dist/types/modules/space/archive.d.ts +75 -0
- package/dist/types/modules/space/archive.d.ts.map +1 -0
- package/dist/types/modules/space/archive.js +2 -0
- package/dist/types/modules/space/archive.js.map +1 -0
- package/dist/types/modules/space/collection.d.ts +51 -0
- package/dist/types/modules/space/collection.d.ts.map +1 -0
- package/dist/types/modules/space/collection.js +2 -0
- package/dist/types/modules/space/collection.js.map +1 -0
- package/dist/types/modules/space/search.d.ts +59 -0
- package/dist/types/modules/space/search.d.ts.map +1 -0
- package/dist/types/modules/space/search.js +2 -0
- package/dist/types/modules/space/search.js.map +1 -0
- package/dist/types/modules/space/space.d.ts +2 -0
- package/dist/types/modules/space/space.d.ts.map +1 -0
- package/dist/types/modules/space/space.js +2 -0
- package/dist/types/modules/space/space.js.map +1 -0
- package/dist/types/modules/toview/toview.d.ts +57 -0
- package/dist/types/modules/toview/toview.d.ts.map +1 -0
- package/dist/types/modules/toview/toview.js +2 -0
- package/dist/types/modules/toview/toview.js.map +1 -0
- package/dist/types/modules/user/auth.d.ts +25 -0
- package/dist/types/modules/user/auth.d.ts.map +1 -0
- package/dist/types/{business → modules/user}/auth.js.map +1 -1
- package/dist/types/{business → modules/user}/level.d.ts +4 -4
- package/dist/types/modules/user/level.d.ts.map +1 -0
- package/dist/types/modules/user/level.js.map +1 -0
- package/dist/types/{business → modules/user}/login.d.ts +3 -3
- package/dist/types/modules/user/login.d.ts.map +1 -0
- package/dist/types/modules/user/login.js.map +1 -0
- package/dist/types/modules/user/relation.d.ts +136 -0
- package/dist/types/modules/user/relation.d.ts.map +1 -0
- package/dist/types/modules/user/relation.js +89 -0
- package/dist/types/modules/user/relation.js.map +1 -0
- package/dist/types/{business → modules/user}/user.d.ts +14 -2
- package/dist/types/modules/user/user.d.ts.map +1 -0
- package/dist/types/{business → modules/user}/user.js +1 -1
- package/dist/types/modules/user/user.js.map +1 -0
- package/dist/types/{business → modules/vip}/vip.d.ts +5 -5
- package/dist/types/modules/vip/vip.d.ts.map +1 -0
- package/dist/types/{business → modules/vip}/vip.js +2 -2
- package/dist/types/modules/vip/vip.js.map +1 -0
- package/dist/utils/arr.d.ts +2 -0
- package/dist/utils/arr.d.ts.map +1 -0
- package/dist/utils/arr.js +4 -0
- package/dist/utils/arr.js.map +1 -0
- package/dist/utils/cookies.d.ts +1 -1
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/url.d.ts +4 -3
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +14 -16
- package/dist/utils/url.js.map +1 -1
- package/package.json +10 -5
- package/dist/client/api.d.ts +0 -23
- package/dist/client/api.d.ts.map +0 -1
- package/dist/client/api.js +0 -128
- package/dist/client/api.js.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/error/index.d.ts.map +0 -1
- package/dist/error/index.js.map +0 -1
- package/dist/index.mjs +0 -704
- package/dist/index.mjs.map +0 -1
- package/dist/index.umd.js +0 -742
- package/dist/index.umd.js.map +0 -1
- package/dist/service/user/index.d.ts +0 -28
- package/dist/service/user/index.d.ts.map +0 -1
- package/dist/service/user/index.js.map +0 -1
- package/dist/test.d.ts +0 -2
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -4
- package/dist/test.js.map +0 -1
- package/dist/types/business/auth.d.ts +0 -15
- package/dist/types/business/auth.d.ts.map +0 -1
- package/dist/types/business/level.d.ts.map +0 -1
- package/dist/types/business/level.js.map +0 -1
- package/dist/types/business/login.d.ts.map +0 -1
- package/dist/types/business/login.js.map +0 -1
- package/dist/types/business/misc.d.ts.map +0 -1
- package/dist/types/business/user.d.ts.map +0 -1
- package/dist/types/business/user.js.map +0 -1
- package/dist/types/business/vip.d.ts.map +0 -1
- package/dist/types/business/vip.js.map +0 -1
- /package/dist/types/{business → modules}/misc.d.ts +0 -0
- /package/dist/types/{business → modules}/misc.js +0 -0
- /package/dist/types/{business → modules/user}/auth.js +0 -0
- /package/dist/types/{business → modules/user}/level.js +0 -0
- /package/dist/types/{business → modules/user}/login.js +0 -0
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/error/index.ts","../src/service/base.ts","../src/utils/cookies.ts","../src/error/handle-error.ts","../src/service/user/qrcode-login.ts","../src/service/user/index.ts","../src/config/index.ts","../src/client/client.ts","../src/stores/mixinkey.ts","../src/utils/url.ts","../src/client/api.ts"],"sourcesContent":["import type { ApiResponse, ApiResponseData, ReturnFormat } from '../types/core/response'\nimport type { BiliClientConfig, BiliClientConfigSnapshot } from '../types/core/client'\nimport type { RequestBody, RequestOptions, RequestOptionsSnapshot, RequestParams } from '../types/core/request'\n\n/**\n * bili 错误\n */\nexport class BiliError extends Error {\n // 原始错误\n rawError?: Error\n // 客户端配置快照(方便排查问题)\n clientConfig: BiliClientConfigSnapshot\n\n constructor(clientConfig: BiliClientConfig, errorMsg?: string, rawError?: unknown) {\n super(errorMsg || '操作失败')\n this.name = 'BiliError'\n this.rawError = rawError instanceof Error ? rawError : new Error(String(rawError))\n\n const { timeout, userAgent, context } = clientConfig\n if (context) {\n const { userInfo, userCookie } = context\n this.clientConfig = {\n timeout,\n userAgent,\n context: {\n userInfo,\n userCookie,\n },\n }\n } else {\n this.clientConfig = {\n timeout,\n userAgent,\n }\n }\n }\n}\n\n/**\n * bili api 错误\n */\nexport class BiliApiError<\n QParams extends RequestParams = RequestParams,\n QData extends RequestBody = RequestBody,\n RRFormat extends ReturnFormat | undefined = undefined,\n> extends BiliError {\n // 请求选项快照(方便排查问题)\n requestOptions: RequestOptionsSnapshot\n\n constructor(\n clientConfig: BiliClientConfig,\n requestOptions: RequestOptions<QParams, QData, RRFormat>,\n errorMsg?: string,\n rawError?: unknown,\n ) {\n super(clientConfig, errorMsg, rawError)\n this.name = 'BiliApiError'\n\n const { url, method, query, data, skipWbiSign, autoCsrf } = requestOptions\n this.requestOptions = {\n url,\n method,\n query,\n data,\n skipWbiSign,\n autoCsrf,\n }\n }\n}\n\n/**\n * bili api HTTP 网络请求层面的错误(网络错误、超时、状态码超出2xx)\n */\nexport class BiliApiHttpError<\n QParams extends RequestParams = RequestParams,\n QData extends RequestBody = RequestBody,\n RRFormat extends ReturnFormat | undefined = undefined,\n> extends BiliApiError<QParams, QData, RRFormat> {\n // 初始值 0 (表示网络层错误,非 HTTP 状态)\n public status: number = 0\n\n constructor(\n clientConfig: BiliClientConfig,\n requestOptions: RequestOptions<QParams, QData, RRFormat>,\n response: Response,\n errorMsg?: string,\n rawError?: unknown,\n ) {\n super(clientConfig, requestOptions, errorMsg || response.statusText || `HTTP ${response.status}`, rawError)\n this.name = 'BiliApiHttpError'\n this.status = response.status\n }\n}\n\n/**\n * bili api 业务出错\n */\nexport class BiliApiBusinessError<\n RD extends ApiResponseData = ApiResponseData,\n QParams extends RequestParams = RequestParams,\n QData extends RequestBody = RequestBody,\n RRFormat extends ReturnFormat | undefined = undefined,\n> extends BiliApiError<QParams, QData, RRFormat> {\n // 业务码 0:成功\n responseCode?: number\n // 接口返回的完整数据\n responseData?: RD\n\n constructor(\n clientConfig: BiliClientConfig,\n requestOptions: RequestOptions<QParams, QData, RRFormat>,\n apiResponse: ApiResponse,\n errorMsg?: string,\n rawError?: unknown,\n ) {\n super(clientConfig, requestOptions, errorMsg || apiResponse.message, rawError)\n this.name = 'BiliApiBusinessError'\n this.responseCode = apiResponse.code ?? -1\n this.responseData = apiResponse.data\n }\n}\n\n/**\n * 操作取消\n */\nexport class BiliAbortError extends BiliError {\n constructor(clientConfig: BiliClientConfig, errorMsg?: string) {\n super(clientConfig, errorMsg || '操作已取消')\n this.name = 'BiliAbortError'\n }\n}\n","import { BiliApi } from '../client/api'\nimport { BiliError } from '../error'\nimport { BaseUtils } from '@ybgnb/utils'\n\nexport class BaseService {\n constructor(public api: BiliApi) {}\n\n public get clientConfig() {\n return this.api.clientConfig\n }\n\n get logging() {\n return this.api.logging\n }\n\n /**\n * 抛出封装的错误\n * @param errorOrMsg 错误对象或者错误信息\n * @param rawError 原始错误对象\n * @protected\n */\n protected throwError(errorOrMsg: string | unknown, rawError?: unknown) {\n throw new BiliError(this.clientConfig, BaseUtils.getErrorMessage(errorOrMsg), rawError)\n }\n\n // 基类的错误处理方法\n protected handleError(error: unknown, className: string, methodName: string): void {\n this.logging.error(`${className}.${methodName} 出现错误`, error)\n if (!(error instanceof BiliError)) {\n // 确保所有错误都包含快照信息\n this.throwError(error)\n }\n }\n}\n","import type { UserCookie } from '../types/business/auth'\n\nexport function parseUserCookie(setCookie: string[]): UserCookie {\n if (!setCookie) throw new Error('setCookie 为空')\n\n const cookies = []\n let bili_jct\n let uid\n\n for (const cookie of setCookie) {\n if (cookie) {\n const item = cookie.slice(0, cookie.indexOf(';') + 1)\n cookies.push(item)\n if (item.startsWith('bili_jct=')) {\n bili_jct = item.slice('bili_jct='.length, -1)\n }\n if (item.startsWith('DedeUserID=')) {\n uid = item.slice('DedeUserID='.length, -1)\n }\n }\n }\n\n if (!bili_jct || !uid) throw new Error('setCookie 解析错误,不存在 bili_jct/uid')\n\n return {\n cookie: cookies.join(' '),\n bili_jct: bili_jct,\n } satisfies UserCookie\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * 错误处理装饰器\n * @constructor\n */\nexport function CatchError() {\n return function (originalMethod: any, context: ClassMethodDecoratorContext) {\n const methodName = String(context.name)\n\n return function (this: any, ...args: any[]) {\n const className = this.constructor.name\n try {\n // 调用原始方法,并保持 this 上下文\n return originalMethod.call(this, ...args)\n } catch (error) {\n // 检查当前实例是否包含基类定义的 handleError 方法\n if (typeof (this as any).handleError === 'function') {\n // 调用基类的错误处理方法,传入错误对象和方法名\n ;(this as any).handleError(error, className, methodName)\n } else {\n // 降级:输出错误到控制台\n console.error(`${className}.${methodName} 未知错误`, error)\n // 重新抛出错误,让上层业务感知\n throw error\n }\n }\n }\n }\n}\n","import { UserService } from './index'\nimport type { QRCodeLoginCallback, QRCodeLoginOptions } from '../../types/business/login'\nimport { BaseUtils } from '@ybgnb/utils'\nimport { BiliError } from '../../error'\nimport type { RequestContext } from '../../types/core/request'\n\n/**\n * 登录轮询间隔时间\n */\nconst QR_CODE_POLL_INTERVAL_MS = 1111\n\n/**\n * 通过二维码登录\n *\n * @param userService - 用户服务实例\n * @param callback - 状态回调接口\n * @param loginOptions - 可选配置(自动刷新、更新上下文、取消信号等)\n * @returns 登录成功后的请求上下文\n */\nexport function loginWithQRCode(\n userService: UserService,\n callback: QRCodeLoginCallback,\n loginOptions?: QRCodeLoginOptions,\n): Promise<RequestContext> {\n const options: QRCodeLoginOptions = {\n updateRequestContext: true,\n autoRefresh: true,\n pollIntervalMs: 1111,\n ...loginOptions,\n }\n // 轮询定时器 ID\n let pollTimer: ReturnType<typeof setTimeout> | null = null\n // 是否正在执行轮询请求(防止并发)\n let isPolling = false\n // 是否正在刷新二维码(防止并发刷新)\n let isRefreshing = false\n // 当前活跃的二维码 key(用于轮询)\n let currentQrCodeKey: string | null = null\n // 用于取消整个流程的 AbortController(如果外部没有提供,则内部创建)\n const internalAbortController = new AbortController()\n const finalSignal = options.signal\n ? (() => {\n // 如果外部提供了 signal,当外部 abort 时,同时触发内部的 abort\n if (options.signal?.aborted) {\n internalAbortController.abort()\n } else if (options.signal) {\n options.signal.addEventListener('abort', () => internalAbortController.abort())\n }\n return internalAbortController.signal\n })()\n : internalAbortController.signal\n\n // 外层 Promise 的 resolve/reject 引用\n let resolvePromise: ((value: RequestContext) => void) | null = null\n let rejectPromise: ((reason?: unknown) => void) | null = null\n\n // 安全调用状态回调\n const safeStatusChange = (msg: string) => {\n try {\n callback.onStatusChange(msg)\n } catch (err) {\n userService.logging.error('[QRCodeLogin] onStatusChange callback error:', err)\n }\n }\n\n // 安全调用二维码回调\n const safeQRCodeReceived = (url: string) => {\n try {\n callback.onQRCodeReceived(url)\n } catch (err) {\n userService.logging.error('[QRCodeLogin] onQRCodeReceived callback error:', err)\n }\n }\n\n // 清理轮询定时器\n const clearPollTimer = () => {\n if (pollTimer) {\n clearTimeout(pollTimer)\n pollTimer = null\n }\n }\n\n // 完全停止登录流程(释放资源)\n const stopLoginFlow = () => {\n clearPollTimer()\n isPolling = false\n isRefreshing = false\n currentQrCodeKey = null\n internalAbortController.abort()\n }\n\n // 处理轮询过程中的错误\n const handlePollError = (err: unknown) => {\n if (finalSignal.aborted) return\n clearPollTimer()\n const errorMsg = BaseUtils.getErrorMessage(err)\n safeStatusChange(errorMsg)\n if (rejectPromise) {\n rejectPromise(new BiliError(userService.clientConfig, errorMsg, err))\n rejectPromise = null\n }\n stopLoginFlow()\n }\n\n // 轮询登录结果\n const pollLoginResult = async (qrCodeKey: string): Promise<void> => {\n if (finalSignal.aborted) return\n if (isPolling) return\n isPolling = true\n\n try {\n if (finalSignal.aborted) return\n\n const loginResult = await userService.getQRCodeLoginResult(qrCodeKey, finalSignal)\n\n if (!pollTimer || finalSignal.aborted) return\n\n safeStatusChange(loginResult.message)\n\n if (loginResult.code === 0) {\n // 登录成功\n clearPollTimer()\n safeStatusChange('已登录,正在获取用户信息...')\n const context = await userService.initLoginSession(\n loginResult.setCookie,\n options.updateRequestContext,\n finalSignal,\n )\n // 成功结束整个 Promise\n if (resolvePromise) {\n resolvePromise(context)\n resolvePromise = null\n rejectPromise = null\n }\n // 结束整个登录流程\n stopLoginFlow()\n return\n }\n\n if (loginResult.code === 86038) {\n // 二维码失效\n if (options.autoRefresh) {\n safeStatusChange('二维码已失效,正在刷新...')\n clearPollTimer()\n await refreshQRCode()\n return\n } else {\n throw new BiliError(userService.clientConfig, '二维码已失效')\n }\n }\n\n // 其他状态码(未扫码、等待确认等),继续轮询\n if (!finalSignal.aborted && pollTimer === null) {\n // 这里使用递归,避免使用 setInterval\n pollTimer = setTimeout(() => {\n pollTimer = null\n pollLoginResult(qrCodeKey).catch(handlePollError)\n }, options.pollIntervalMs || QR_CODE_POLL_INTERVAL_MS)\n }\n } catch (err) {\n handlePollError(err)\n } finally {\n isPolling = false\n }\n }\n\n // 刷新二维码(重新获取二维码并启动轮询)\n const refreshQRCode = async (): Promise<void> => {\n if (isRefreshing || finalSignal.aborted) return\n isRefreshing = true\n\n clearPollTimer()\n isPolling = false\n currentQrCodeKey = null\n\n try {\n safeStatusChange('获取二维码中...')\n const qrCode = await userService.getLoginQRCode(finalSignal)\n if (finalSignal.aborted) return\n\n currentQrCodeKey = qrCode.qrcode_key\n safeQRCodeReceived(qrCode.url)\n safeStatusChange('请使用手机App扫码登录...')\n\n if (!finalSignal.aborted) {\n clearPollTimer()\n pollLoginResult(currentQrCodeKey).catch(handlePollError)\n }\n } catch (err) {\n if (!finalSignal.aborted) {\n const errorMsg = BaseUtils.getErrorMessage(err)\n safeStatusChange(errorMsg)\n if (rejectPromise) {\n rejectPromise(new BiliError(userService.clientConfig, errorMsg, err))\n rejectPromise = null\n }\n stopLoginFlow()\n }\n } finally {\n isRefreshing = false\n }\n }\n\n // 处理外部取消信号\n const onExternalAbort = () => {\n stopLoginFlow()\n if (rejectPromise) {\n rejectPromise('取消登录')\n rejectPromise = null\n }\n }\n options.signal?.addEventListener('abort', onExternalAbort)\n\n // 启动流程\n const promise = new Promise<RequestContext>((resolve, reject) => {\n resolvePromise = resolve\n rejectPromise = reject\n\n if (options.signal?.aborted) {\n reject('取消登录')\n return\n }\n\n refreshQRCode().catch((err) => {\n if (rejectPromise) {\n rejectPromise(err)\n rejectPromise = null\n }\n })\n })\n\n return promise.finally(() => {\n options.signal?.removeEventListener('abort', onExternalAbort)\n stopLoginFlow()\n resolvePromise = null\n rejectPromise = null\n })\n}\n","import { BaseService } from '../base'\nimport type {\n LoginQRCode,\n QRCodeLoginCallback,\n QRCodeLoginOptions,\n QRCodeLoginResult,\n} from '../../types/business/login'\nimport { parseUserCookie } from '../../utils/cookies'\nimport { CatchError } from '../../error/handle-error'\nimport type { Buvids, UserCookie } from '../../types/business/auth'\nimport type { UserInfo } from '../../types/business/user'\nimport type { RequestContext } from '../../types/core/request'\nimport { loginWithQRCode } from './qrcode-login'\n\nexport class UserService extends BaseService {\n /**\n * 获取登录二维码\n */\n @CatchError()\n getLoginQRCode(signal?: AbortSignal) {\n return this.api.request<LoginQRCode>(`https://passport.bilibili.com/x/passport-login/web/qrcode/generate`, {\n signal,\n })\n }\n\n /**\n * 获取二维码登录结果\n */\n @CatchError()\n async getQRCodeLoginResult(qrcode_key: string, signal?: AbortSignal): Promise<QRCodeLoginResult> {\n const response = await this.api.request('https://passport.bilibili.com/x/passport-login/web/qrcode/poll', {\n query: {\n qrcode_key,\n },\n skipWbiSign: true,\n returnFormat: 'RawResponse',\n signal: signal,\n })\n const apiResponse = await response.json()\n return {\n ...apiResponse.data,\n setCookie: response.headers.getSetCookie(),\n } as QRCodeLoginResult\n }\n\n @CatchError()\n async loginWithQRCode(callback: QRCodeLoginCallback, loginOptions?: QRCodeLoginOptions): Promise<RequestContext> {\n return loginWithQRCode(this, callback, loginOptions)\n }\n\n @CatchError()\n getBuvids(signal?: AbortSignal) {\n return this.api.request<Buvids>('https://api.bilibili.com/x/frontend/finger/spi', { signal })\n }\n\n @CatchError()\n getUserInfo(cookie?: UserCookie, signal?: AbortSignal) {\n return this.api.request<UserInfo>('https://api.bilibili.com/x/space/myinfo', {\n cookie,\n signal,\n })\n }\n\n /**\n * 登录后初始化(cookie / 用户信息等)\n */\n @CatchError()\n async initLoginSession(\n setCookie: string[],\n updateRequestContext: boolean = true,\n signal?: AbortSignal,\n ): Promise<RequestContext> {\n this.logging.info(`初始化用户数据...`)\n\n const userCookie = parseUserCookie(setCookie)\n\n // 完善cookie\n const { b_3, b_4 } = await this.getBuvids(signal)\n userCookie.cookie = `${userCookie.cookie} buvid3=${b_3}; buvid4=${b_4}; `\n\n const userInfo = await this.getUserInfo(userCookie, signal)\n\n const context = {\n userCookie: userCookie,\n userInfo: userInfo,\n } satisfies RequestContext\n\n if (updateRequestContext) {\n this.clientConfig.context = context\n }\n\n this.logging.info(`已完成用户登录:${userInfo.name} ${userInfo.mid}`)\n return context\n }\n}\n","import type { BiliClientConfig, ConsoleMethod } from '../types/core/client'\nimport type { RequestBody, RequestOptions, RequestParams } from '../types/core/request'\n\n/**\n * 默认的客户端配置\n */\nexport const defaultClientConfig = {\n timeout: 5000,\n userAgent: '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google Chrome\";v=\"146\"',\n referer: 'https://space.bilibili.com/10000',\n logLevel: 'info',\n logging: {\n debug: (...data: Parameters<ConsoleMethod>) => {\n console.error(`[${new Date().toLocaleString()}]`, ...data)\n },\n info: (...data: Parameters<ConsoleMethod>) => {\n console.info(`[${new Date().toLocaleString()}]`, ...data)\n },\n error: (...data: Parameters<ConsoleMethod>) => {\n console.error(`[${new Date().toLocaleString()}]`, ...data)\n },\n },\n} satisfies BiliClientConfig\n\n/**\n * 默认的请求选项\n */\nexport const defaultRequestOptions: Omit<RequestOptions<RequestParams, RequestBody, 'ApiResponseData'>, 'url'> = {\n method: 'GET',\n returnFormat: 'ApiResponseData',\n ignoreBusinessError: false,\n skipWbiSign: false,\n autoCsrf: true,\n}\n","import { type BiliClientConfig } from '../types/core/client'\nimport { UserService } from '../service/user'\nimport { defaultClientConfig } from '../config'\nimport { BiliApi } from './api'\nimport type { RequestContext } from '../types/core/request'\n\n/**\n * bili 客户端\n */\nexport class BiliClient {\n /**\n * 客户端配置\n */\n config: BiliClientConfig\n /**\n * 基础的api接口\n */\n api: BiliApi\n /**\n * 用户模块\n */\n user: UserService\n\n get logging() {\n return this.config.logging\n }\n\n constructor(config?: Partial<BiliClientConfig>) {\n this.config = { ...defaultClientConfig, ...(config ?? {}) }\n this.api = new BiliApi(this)\n this.user = new UserService(this.api)\n }\n\n updateRequestContext(requestContext: RequestContext) {\n this.config.context = requestContext\n }\n}\n\n/**\n * 公用的Bili客户端\n */\nexport const commonBiliClient = new BiliClient()\n","import { commonBiliClient } from '../client/client'\n\nlet mixinKey: string | undefined\n// 初始化的 Promise\nlet initPromise: Promise<void> | null = null\n// 上一次更新 wbiKey 的时间戳(毫秒)\nlet wbiKeyLastUpdatedAt: number = 0\n// mixinKey 更新定时器\nlet mixinKeyUpdateTimer: ReturnType<typeof setTimeout> | undefined = undefined\n// 一天的毫秒数\nconst MILLIS_PER_DAY = 24 * 60 * 60 * 1000\n\n/**\n * mixinKey(wbi签名需要的参数)\n */\nexport const mixinKeyStore = {\n get: async () => {\n if (mixinKey) return mixinKey\n\n if (!initPromise) {\n initPromise = initMixinKey().catch(() => {\n initPromise = null\n })\n }\n\n await initPromise\n return mixinKey!\n },\n}\n\n// 判断是否非同一天\nfunction isNotSameDay(timestamp1: number, timestamp2: number) {\n return Math.floor(timestamp1 / MILLIS_PER_DAY) !== Math.floor(timestamp2 / MILLIS_PER_DAY)\n}\n\n// 重排映射表\nconst mixinKeyEncTab = [\n 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41,\n 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34,\n 44, 52,\n]\n\n// 生成 MixinKey\nconst generateMixinKey = (imgKey: string, subKey: string) => {\n const raw_wbi_key = imgKey + subKey\n return mixinKeyEncTab\n .map((n) => raw_wbi_key[n])\n .join('')\n .slice(0, 32)\n}\n\n// 初始化 mixin key\nconst initMixinKey = async () => {\n await updateMixinKey()\n if (!mixinKeyUpdateTimer) {\n clearInterval(mixinKeyUpdateTimer)\n }\n mixinKeyUpdateTimer = setInterval(() => {\n if (isNotSameDay(wbiKeyLastUpdatedAt, Date.now())) {\n // 不是同一天,需要更新MixinKey\n updateMixinKey()\n }\n }, 300_000) // 5分钟检测一次\n}\n\n// 更新 mixin key\nconst updateMixinKey = async () => {\n try {\n const now = Date.now()\n const nav = (await (await fetch('https://api.bilibili.com/x/web-interface/nav')).json()).data\n\n const getKey = (url: string) => {\n const pathname = new URL(url).pathname\n const filename = pathname.split('/').pop()!\n return filename.replace(/\\.[^.]+$/, '')\n }\n\n const imgKey = getKey(nav.wbi_img.img_url)\n const subKey = getKey(nav.wbi_img.sub_url)\n\n mixinKey = generateMixinKey(imgKey, subKey)\n commonBiliClient.logging.info(`初始化 MixinKey:${mixinKey}`)\n wbiKeyLastUpdatedAt = now\n } catch (err) {\n commonBiliClient.logging.error('初始化 MixinKey 失败', err)\n throw err\n }\n}\n","import md5 from 'md5'\nimport { mixinKeyStore } from '../stores/mixinkey'\nimport type { RequestParams } from '../types/core/request'\n\n// URL query 中必须编码的保留字符 (RFC 3986)\nconst invalidCharRegex = /[!'()*]/g\n\n/**\n * 解析 url\n * @param urlStr\n */\nexport function parseURL(urlStr: string) {\n try {\n const url = new URL(urlStr)\n return {\n baseUrl: url.origin + url.pathname,\n searchParams: url.searchParams,\n }\n } catch (_) {\n throw new Error('URL 无效')\n }\n}\n\n/**\n * 编码 URL 参数\n * @param params 查询参数\n */\nexport function encodeURLParams(params: RequestParams) {\n return (\n Object.keys(params)\n // 排序\n .sort()\n // 编码 key 和 value\n .map((key) => {\n const raw = params[key]\n if (raw === undefined || raw === null) return ''\n\n const value = String(raw).replace(invalidCharRegex, '')\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n })\n // 拼接\n .join('&')\n )\n}\n\n/**\n * wbi 签名\n * @param params\n */\nexport function wbiSign(params: RequestParams) {\n // 先按要求编码\n const query = encodeURLParams(params)\n // 再进行签名\n return query + '&w_rid=' + md5(query + mixinKeyStore.get())\n}\n\n/**\n * 处理 url 查询参数\n * @param urlSearchParams\n * @param params\n * @param skipWbiSign\n * @return 查询字符串\n */\nexport function handleUrlParams<QParams = RequestParams>(\n urlSearchParams: URLSearchParams,\n params?: QParams,\n skipWbiSign?: boolean,\n): string {\n try {\n let finalParams: RequestParams = {}\n if (urlSearchParams.size > 0) {\n // 合并url里的查询参数\n urlSearchParams.forEach((value, key) => {\n finalParams[key] = value\n })\n }\n // 处理单独传的查询参数对象\n if (params) {\n finalParams = { ...finalParams, ...params }\n }\n\n // 添加 wts\n if (!finalParams.wts) finalParams.wts = Math.floor(Date.now() / 1000)\n\n // 判断是否跳过 wbi 签名\n if (skipWbiSign || Object.keys(finalParams).length === 1) {\n // 简单编码即可\n return `${encodeURLParams(finalParams)}`\n } else {\n // wbi 签名\n return `${wbiSign(finalParams)}`\n }\n } catch (_) {\n throw new Error('查询参数无效')\n }\n}\n","import { handleUrlParams, parseURL } from '../utils/url'\n\nimport type { BiliClient } from './client'\nimport { defaultRequestOptions } from '../config'\nimport type { ApiResponse, ApiResponseData, RawResponse, ReturnFormat, ReturnFormatMap } from '../types/core/response'\nimport type { RequestBody, RequestOptions, RequestParams } from '../types/core/request'\nimport { BiliAbortError, BiliApiBusinessError, BiliApiHttpError, BiliError } from '../error'\n\n/**\n * bili 接口\n */\nexport class BiliApi {\n constructor(private client: BiliClient) {}\n\n public get clientConfig() {\n return this.client.config\n }\n\n get logging() {\n return this.clientConfig.logging\n }\n\n get isDebug() {\n return this.clientConfig.logLevel === 'debug'\n }\n\n /**\n * 记录接口成功的日志\n */\n logApiSuccess(prefix: string, returnFormat: ReturnFormat, response: RawResponse | ApiResponse | ApiResponseData) {\n if (returnFormat === 'RawResponse') {\n this.logging.info(`${prefix} 请求成功 [RawResponse]`)\n } else if (returnFormat === 'ApiResponse') {\n this.logging.info(`${prefix} 请求成功 [ApiResponse]`, this.isDebug ? JSON.stringify(response) : '')\n } else {\n this.logging.info(`${prefix} 请求成功`, this.isDebug ? JSON.stringify(response) : '')\n }\n }\n\n /**\n * 记录接口错误的日志\n */\n logApiError(prefix: string, error: unknown) {\n // 规范化日志输出\n if (error instanceof BiliAbortError) {\n this.logging.info(`${prefix} [${error.message}]`)\n } else if (error instanceof BiliApiHttpError) {\n this.logging.info(`${prefix} [http error]:${error.message}(${error.status})`)\n } else if (error instanceof BiliError) {\n this.logging.info(`${prefix} ${error.message}`)\n } else {\n this.logging.info(`${prefix} 出现未知错误`, error)\n }\n }\n\n async request<\n RData extends ApiResponseData = ApiResponseData,\n QParams extends RequestParams = RequestParams,\n QData extends RequestBody = RequestBody,\n RRFormat extends ReturnFormat | undefined = undefined,\n >(\n url: string,\n options?: Partial<RequestOptions<QParams, QData, RRFormat>>,\n ): Promise<ReturnFormatMap<RData, RRFormat>> {\n const { context, userAgent, timeout: timeoutMS, referer } = this.clientConfig\n // 合并默认选项\n const finalOptions = { ...defaultRequestOptions, url: url, ...options } as RequestOptions<QParams, QData, RRFormat>\n // 构建日志前缀\n const userInfo = context?.userInfo.mid ? ` [${context?.userInfo.mid}]` : ''\n const prefix = `[bili API]${userInfo} ${finalOptions.method} ${new URL(url).pathname}`\n\n try {\n // 解析 url\n const { baseUrl, searchParams } = parseURL(url)\n // 构建查询字符串\n const searchStr = handleUrlParams(searchParams, finalOptions.query, finalOptions.skipWbiSign)\n // 最终的 url\n const finalUrl = `${baseUrl}?${searchStr}`\n finalOptions.url = finalUrl\n\n this.logging.info(`${prefix} 请求中 ${searchStr}`)\n\n // FormData 请求时,判断是否需要自动添加 csrf 参数\n if (finalOptions.method === 'POST' && finalOptions.data && finalOptions.autoCsrf) {\n if (finalOptions.data instanceof FormData) {\n finalOptions.data.set('csrf', context?.userCookie.bili_jct ?? '')\n }\n }\n\n // 初始化 fetch 的配置\n const fetchInit: RequestInit = {\n signal: options?.signal\n ? AbortSignal.any([options?.signal, AbortSignal.timeout(timeoutMS)])\n : AbortSignal.timeout(timeoutMS),\n headers: {\n 'User-Agent': userAgent,\n cookie: finalOptions.cookie?.cookie || context?.userCookie.cookie || '',\n Referer: typeof referer === 'function' ? referer(finalUrl) : referer,\n },\n method: finalOptions.method,\n body: finalOptions.data,\n ...(options?.init ?? {}),\n }\n\n const httpResponse = await fetch(finalUrl, fetchInit)\n\n if (!httpResponse.ok) {\n // http 请求错误\n throw new BiliApiHttpError(this.clientConfig, finalOptions, httpResponse)\n }\n\n if (finalOptions.returnFormat === 'RawResponse') {\n // 直接返回原始响应\n this.logApiSuccess(prefix, 'RawResponse', httpResponse)\n return httpResponse as ReturnFormatMap<RData, RRFormat>\n }\n\n let biliResponse: ApiResponse<RData>\n try {\n // 解析 bili 响应数据\n biliResponse = await httpResponse.json()\n } catch (e) {\n throw new BiliApiHttpError(this.clientConfig, finalOptions, httpResponse, '解析响应数据错误', e)\n }\n\n // 业务操作失败\n if (!finalOptions.ignoreBusinessError && biliResponse.code !== 0) {\n throw new BiliApiBusinessError(this.clientConfig, finalOptions, biliResponse)\n }\n\n if (finalOptions.returnFormat === 'ApiResponse') {\n // 只需要返回响应数据\n this.logApiSuccess(prefix, 'ApiResponse', biliResponse)\n return biliResponse as ReturnFormatMap<RData, RRFormat>\n }\n\n // 返回业务数据\n this.logApiSuccess(prefix, 'ApiResponseData', biliResponse.data)\n return biliResponse.data as ReturnFormatMap<RData, RRFormat>\n } catch (error) {\n this.logApiError('', error)\n throw error\n }\n }\n}\n"],"mappings":"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"}
|