@ybgnb/bili-api 0.0.1 → 0.0.3

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.
Files changed (103) hide show
  1. package/LICENSE +1 -1
  2. package/dist/index.d.ts +5832 -9
  3. package/dist/index.js +1 -7
  4. package/package.json +23 -13
  5. package/readme.md +2 -1
  6. package/dist/client/api.d.ts +0 -23
  7. package/dist/client/api.d.ts.map +0 -1
  8. package/dist/client/api.js +0 -128
  9. package/dist/client/api.js.map +0 -1
  10. package/dist/client/client.d.ts +0 -25
  11. package/dist/client/client.d.ts.map +0 -1
  12. package/dist/client/client.js +0 -22
  13. package/dist/client/client.js.map +0 -1
  14. package/dist/client/common.d.ts +0 -6
  15. package/dist/client/common.d.ts.map +0 -1
  16. package/dist/client/common.js +0 -13
  17. package/dist/client/common.js.map +0 -1
  18. package/dist/config/index.d.ts +0 -22
  19. package/dist/config/index.d.ts.map +0 -1
  20. package/dist/config/index.js +0 -32
  21. package/dist/config/index.js.map +0 -1
  22. package/dist/error/handle-error.d.ts +0 -6
  23. package/dist/error/handle-error.d.ts.map +0 -1
  24. package/dist/error/handle-error.js +0 -32
  25. package/dist/error/handle-error.js.map +0 -1
  26. package/dist/error/index.d.ts +0 -40
  27. package/dist/error/index.d.ts.map +0 -1
  28. package/dist/error/index.js +0 -79
  29. package/dist/error/index.js.map +0 -1
  30. package/dist/index.d.ts.map +0 -1
  31. package/dist/index.js.map +0 -1
  32. package/dist/index.mjs +0 -704
  33. package/dist/index.mjs.map +0 -1
  34. package/dist/index.umd.js +0 -742
  35. package/dist/index.umd.js.map +0 -1
  36. package/dist/service/base.d.ts +0 -17
  37. package/dist/service/base.d.ts.map +0 -1
  38. package/dist/service/base.js +0 -34
  39. package/dist/service/base.js.map +0 -1
  40. package/dist/service/user/index.d.ts +0 -28
  41. package/dist/service/user/index.d.ts.map +0 -1
  42. package/dist/service/user/index.js +0 -148
  43. package/dist/service/user/index.js.map +0 -1
  44. package/dist/service/user/qrcode-login.d.ts +0 -13
  45. package/dist/service/user/qrcode-login.d.ts.map +0 -1
  46. package/dist/service/user/qrcode-login.js +0 -88
  47. package/dist/service/user/qrcode-login.js.map +0 -1
  48. package/dist/stores/mixinkey.d.ts +0 -8
  49. package/dist/stores/mixinkey.d.ts.map +0 -1
  50. package/dist/stores/mixinkey.js +0 -86
  51. package/dist/stores/mixinkey.js.map +0 -1
  52. package/dist/test.d.ts +0 -2
  53. package/dist/test.d.ts.map +0 -1
  54. package/dist/test.js +0 -4
  55. package/dist/test.js.map +0 -1
  56. package/dist/types/business/auth.d.ts +0 -15
  57. package/dist/types/business/auth.d.ts.map +0 -1
  58. package/dist/types/business/auth.js +0 -2
  59. package/dist/types/business/auth.js.map +0 -1
  60. package/dist/types/business/level.d.ts +0 -22
  61. package/dist/types/business/level.d.ts.map +0 -1
  62. package/dist/types/business/level.js +0 -2
  63. package/dist/types/business/level.js.map +0 -1
  64. package/dist/types/business/login.d.ts +0 -35
  65. package/dist/types/business/login.d.ts.map +0 -1
  66. package/dist/types/business/login.js +0 -2
  67. package/dist/types/business/login.js.map +0 -1
  68. package/dist/types/business/misc.d.ts +0 -9
  69. package/dist/types/business/misc.d.ts.map +0 -1
  70. package/dist/types/business/misc.js +0 -2
  71. package/dist/types/business/misc.js.map +0 -1
  72. package/dist/types/business/user.d.ts +0 -34
  73. package/dist/types/business/user.d.ts.map +0 -1
  74. package/dist/types/business/user.js +0 -10
  75. package/dist/types/business/user.js.map +0 -1
  76. package/dist/types/business/vip.d.ts +0 -36
  77. package/dist/types/business/vip.d.ts.map +0 -1
  78. package/dist/types/business/vip.js +0 -19
  79. package/dist/types/business/vip.js.map +0 -1
  80. package/dist/types/core/client.d.ts +0 -38
  81. package/dist/types/core/client.d.ts.map +0 -1
  82. package/dist/types/core/client.js +0 -2
  83. package/dist/types/core/client.js.map +0 -1
  84. package/dist/types/core/request.d.ts +0 -87
  85. package/dist/types/core/request.d.ts.map +0 -1
  86. package/dist/types/core/request.js +0 -2
  87. package/dist/types/core/request.js.map +0 -1
  88. package/dist/types/core/response.d.ts +0 -26
  89. package/dist/types/core/response.d.ts.map +0 -1
  90. package/dist/types/core/response.js +0 -2
  91. package/dist/types/core/response.js.map +0 -1
  92. package/dist/utils/cookies.d.ts +0 -3
  93. package/dist/utils/cookies.d.ts.map +0 -1
  94. package/dist/utils/cookies.js +0 -26
  95. package/dist/utils/cookies.js.map +0 -1
  96. package/dist/utils/time.d.ts +0 -3
  97. package/dist/utils/time.d.ts.map +0 -1
  98. package/dist/utils/time.js +0 -26
  99. package/dist/utils/time.js.map +0 -1
  100. package/dist/utils/url.d.ts +0 -31
  101. package/dist/utils/url.d.ts.map +0 -1
  102. package/dist/utils/url.js +0 -93
  103. package/dist/utils/url.js.map +0 -1
@@ -1,22 +0,0 @@
1
- /**
2
- * 用户等级经验信息
3
- */
4
- export interface LevelExp {
5
- /**
6
- * 当前等级 (0-6级)
7
- */
8
- current_level: number;
9
- /**
10
- * 当前等级起始经验值 (固定为0)
11
- */
12
- current_min: number;
13
- /**
14
- * 当前账户经验值
15
- */
16
- current_exp: number;
17
- /**
18
- * 升至下一等级所需的总经验值 (非差值)
19
- */
20
- next_exp: number;
21
- }
22
- //# sourceMappingURL=level.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../../src/types/business/level.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACjB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=level.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"level.js","sourceRoot":"","sources":["../../../src/types/business/level.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- /**
2
- * 登录二维码
3
- */
4
- export interface LoginQRCode {
5
- url: string;
6
- qrcode_key: string;
7
- }
8
- /**
9
- * 二维码登录结果
10
- */
11
- export interface QRCodeLoginResult {
12
- url: string;
13
- refresh_token: string;
14
- code: number;
15
- timestamp: number;
16
- message: string;
17
- setCookie: string[];
18
- }
19
- /**
20
- * 二维码登录回调
21
- */
22
- export interface QRCodeLoginCallback {
23
- onQRCodeReceived: (qrcodeUrl: string) => Promise<void>;
24
- onStatusChange: (msg: string) => void;
25
- }
26
- /**
27
- * 二维码登录选项
28
- */
29
- export interface QRCodeLoginOptions {
30
- updateRequestContext?: boolean;
31
- autoRefresh?: boolean;
32
- signal: AbortSignal;
33
- pollIntervalMs?: number;
34
- }
35
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/types/business/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAGtD,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAEjC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,MAAM,EAAE,WAAW,CAAA;IAEnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/types/business/login.ts"],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
1
- /**
2
- * 时间戳(毫秒)
3
- */
4
- export type TimestampMs = number;
5
- /**
6
- * 时长(毫秒)
7
- */
8
- export type DurationMs = number;
9
- //# sourceMappingURL=misc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/types/business/misc.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=misc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/types/business/misc.ts"],"names":[],"mappings":""}
@@ -1,34 +0,0 @@
1
- /**
2
- * 封禁状态配置
3
- */
4
- export declare const SILENCE_STATUS: {
5
- readonly NORMAL: 0;
6
- readonly BLOCKED: 1;
7
- };
8
- /**
9
- * 封禁状态类型
10
- */
11
- export type SilenceStatus = (typeof SILENCE_STATUS)[keyof typeof SILENCE_STATUS];
12
- /**
13
- * bili 用户卡片信息(信息较少)
14
- */
15
- export interface UserCard {
16
- mid: number;
17
- name: string;
18
- face: string;
19
- sign: string;
20
- rank: number;
21
- level: number;
22
- silence: SilenceStatus;
23
- }
24
- /**
25
- * bili 用户信息
26
- */
27
- export interface UserInfo extends UserCard {
28
- sex: '男' | '女' | '保密';
29
- moral: number;
30
- following: number;
31
- follower: number;
32
- [k: string]: unknown;
33
- }
34
- //# sourceMappingURL=user.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/types/business/user.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAKjB,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAA;AAEhF;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,GAAG,EAAE,MAAM,CAAA;IAEX,IAAI,EAAE,MAAM,CAAA;IAEZ,IAAI,EAAE,MAAM,CAAA;IAEZ,IAAI,EAAE,MAAM,CAAA;IAEZ,IAAI,EAAE,MAAM,CAAA;IAEZ,KAAK,EAAE,MAAM,CAAA;IAEb,OAAO,EAAE,aAAa,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ;IAExC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IAErB,KAAK,EAAE,MAAM,CAAA;IAEb,SAAS,EAAE,MAAM,CAAA;IAEjB,QAAQ,EAAE,MAAM,CAAA;IAEhB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB"}
@@ -1,10 +0,0 @@
1
- /**
2
- * 封禁状态配置
3
- */
4
- export const SILENCE_STATUS = {
5
- // 正常
6
- NORMAL: 0,
7
- // 被封
8
- BLOCKED: 1,
9
- };
10
- //# sourceMappingURL=user.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/types/business/user.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK;IACL,MAAM,EAAE,CAAC;IACT,KAAK;IACL,OAAO,EAAE,CAAC;CACF,CAAA"}
@@ -1,36 +0,0 @@
1
- import type { TimestampMs } from './misc.js';
2
- /**
3
- * vip 类型配置
4
- */
5
- export declare const VIP_TYPE: {
6
- readonly NONE: 0;
7
- readonly MONTH: 1;
8
- readonly YEAR: 2;
9
- };
10
- /**
11
- * vip 类型
12
- */
13
- export type VipType = (typeof VIP_TYPE)[keyof typeof VIP_TYPE];
14
- /**
15
- * vip 状态配置
16
- */
17
- export declare const VIP_STATUS: {
18
- readonly NONE: 0;
19
- readonly YES: 1;
20
- };
21
- /**
22
- * vip 状态类型
23
- */
24
- export type VipStatus = (typeof VIP_STATUS)[keyof typeof VIP_STATUS];
25
- /**
26
- * VIP 信息
27
- */
28
- export interface VIP {
29
- /** 会员类型: 0=无, 1=月度大会员, 2=年度以上大会员 */
30
- vipType: VipType;
31
- /** 会员到期时间, 时间戳(毫秒) */
32
- vipDueDate: TimestampMs;
33
- /** 大会员状态: 0=无, 1=有 */
34
- vipStatus: VipStatus;
35
- }
36
- //# sourceMappingURL=vip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vip.d.ts","sourceRoot":"","sources":["../../../src/types/business/vip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;CAOX,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAA;AAE9D;;GAEG;AACH,eAAO,MAAM,UAAU;;;CAGb,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,UAAU,EAAE,WAAW,CAAA;IACvB,sBAAsB;IACtB,SAAS,EAAE,SAAS,CAAA;CACrB"}
@@ -1,19 +0,0 @@
1
- /**
2
- * vip 类型配置
3
- */
4
- export const VIP_TYPE = {
5
- // 无
6
- NONE: 0,
7
- // 月度大会员
8
- MONTH: 1,
9
- // 年度以上大会员
10
- YEAR: 2,
11
- };
12
- /**
13
- * vip 状态配置
14
- */
15
- export const VIP_STATUS = {
16
- NONE: 0,
17
- YES: 1,
18
- };
19
- //# sourceMappingURL=vip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vip.js","sourceRoot":"","sources":["../../../src/types/business/vip.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI;IACJ,IAAI,EAAE,CAAC;IACP,QAAQ;IACR,KAAK,EAAE,CAAC;IACR,UAAU;IACV,IAAI,EAAE,CAAC;CACC,CAAA;AAOV;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;CACE,CAAA"}
@@ -1,38 +0,0 @@
1
- import type { RequestContext } from './request.js';
2
- /**
3
- * 日志记录的函数参数类型,复用 console
4
- */
5
- export type ConsoleMethod = Console['log'];
6
- /**
7
- * bili 客户端日志记录(默认输出到控制台)
8
- */
9
- export type ClientLogging = {
10
- info: ConsoleMethod;
11
- debug: ConsoleMethod;
12
- error: ConsoleMethod;
13
- };
14
- /**
15
- * bili 客户端日志级别
16
- */
17
- export type LogLevel = keyof ClientLogging;
18
- /**
19
- * bili 客户端的配置
20
- */
21
- export interface BiliClientConfig {
22
- timeout: number;
23
- userAgent: string;
24
- referer: string | ((url: string) => string);
25
- context?: RequestContext;
26
- logLevel: LogLevel;
27
- logging: ClientLogging;
28
- autoMixinKey: boolean;
29
- }
30
- /**
31
- * bili 客户端的配置快照(较少信息)
32
- */
33
- export interface BiliClientConfigSnapshot {
34
- timeout: number;
35
- userAgent: string;
36
- context?: Partial<RequestContext>;
37
- }
38
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/types/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGlD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;AAE1C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,aAAa,CAAA;IACpB,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,EAAE,MAAM,CAAA;IAEjB,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IAE3C,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB,QAAQ,EAAE,QAAQ,CAAA;IAElB,OAAO,EAAE,aAAa,CAAA;IAEtB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAClC"}
@@ -1,2 +0,0 @@
1
- import { mixinKeyStore } from '../../stores/mixinkey.js';
2
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/types/core/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1,87 +0,0 @@
1
- import type { UserCard } from '../business/user.js';
2
- import type { UserCookie } from '../business/auth.js';
3
- import type { ApiResponseData, ReturnFormat, ReturnFormatMap } from './response.js';
4
- /**
5
- * bili 请求参数
6
- */
7
- export type RequestParams = Record<string, string | number | boolean | null | undefined>;
8
- /**
9
- * bili 请求体
10
- */
11
- export type RequestBody = BodyInit;
12
- /**
13
- * bili 请求上下文(需要用户信息和cookie)
14
- */
15
- export interface RequestContext {
16
- userInfo: UserCard;
17
- userCookie: UserCookie;
18
- }
19
- export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
20
- /**
21
- * bili 请求配置
22
- */
23
- export interface RequestOptions<QParams extends RequestParams = RequestParams, QData extends RequestBody = RequestBody, RRFormat extends ReturnFormat | undefined = undefined> {
24
- /**
25
- * 请求url
26
- */
27
- url: string;
28
- /**
29
- * 请求类型
30
- * @default 'GET'
31
- */
32
- method: RequestMethod;
33
- /**
34
- * 查询参数
35
- */
36
- query?: QParams;
37
- /**
38
- * 请求体数据
39
- */
40
- data?: QData;
41
- /**
42
- * 返回格式
43
- * @default 'ApiResponseData'
44
- */
45
- returnFormat: RRFormat;
46
- /**
47
- * 是否忽略业务失败(rep.data.code !== 0)
48
- * - true: 不抛出异常
49
- * - false: 业务失败时抛出异常
50
- * @default false
51
- */
52
- ignoreBusinessError: boolean;
53
- /**
54
- * 是否跳过 WBI 签名
55
- * - false: 对查询参数进行 WBI 签名
56
- * - true: 跳过签名
57
- * @default false
58
- */
59
- skipWbiSign: boolean;
60
- /**
61
- * 是否自动添加 CSRF 参数(bili_jct)
62
- * - 仅在 POST 请求时生效
63
- * @default true
64
- */
65
- autoCsrf: boolean;
66
- /**
67
- * 指定用户ccokie,不使用请求上下文里的用户cookie
68
- */
69
- cookie?: UserCookie;
70
- /**
71
- * 取消信号
72
- */
73
- signal?: AbortSignal;
74
- /**
75
- * fetch 的初始控制
76
- */
77
- init?: RequestInit;
78
- }
79
- /**
80
- * bili 请求
81
- */
82
- export type BiliRequest = <RData extends ApiResponseData = ApiResponseData, QParams extends RequestParams = RequestParams, QData extends RequestBody = RequestBody, RRFormat extends ReturnFormat | undefined = undefined>(url: string, options?: Partial<RequestOptions<QParams, QData, RRFormat>>, init?: RequestInit) => Promise<ReturnFormatMap<RData, RRFormat>>;
83
- /**
84
- * bili 请求选项快照(较少信息)
85
- */
86
- export type RequestOptionsSnapshot = Pick<RequestOptions, 'url' | 'method' | 'query' | 'data' | 'skipWbiSign' | 'autoCsrf'>;
87
- //# sourceMappingURL=request.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/types/core/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEnF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;AAExF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc,CAC7B,OAAO,SAAS,aAAa,GAAG,aAAa,EAC7C,KAAK,SAAS,WAAW,GAAG,WAAW,EACvC,QAAQ,SAAS,YAAY,GAAG,SAAS,GAAG,SAAS;IAErD;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAA;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ;;;OAGG;IACH,YAAY,EAAE,QAAQ,CAAA;IACtB;;;;;OAKG;IACH,mBAAmB,EAAE,OAAO,CAAA;IAC5B;;;;;OAKG;IACH,WAAW,EAAE,OAAO,CAAA;IACpB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;OAEG;IACH,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,SAAS,eAAe,GAAG,eAAe,EAC/C,OAAO,SAAS,aAAa,GAAG,aAAa,EAC7C,KAAK,SAAS,WAAW,GAAG,WAAW,EACvC,QAAQ,SAAS,YAAY,GAAG,SAAS,GAAG,SAAS,EAErD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAC3D,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,cAAc,EACd,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,CACjE,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/types/core/request.ts"],"names":[],"mappings":""}
@@ -1,26 +0,0 @@
1
- /**
2
- * http 原始响应
3
- */
4
- export type RawResponse = Response;
5
- /**
6
- * bili 接口响应
7
- */
8
- export interface ApiResponse<D extends ApiResponseData = ApiResponseData> {
9
- code: number;
10
- ttl: number;
11
- message: string;
12
- data: D;
13
- }
14
- /**
15
- * bili 接口响应的数据
16
- */
17
- export type ApiResponseData = any;
18
- /**
19
- * bili 请求的返回格式,分别对应 HttpResponse、BiliResponse、BiliResponseData
20
- */
21
- export type ReturnFormat = 'RawResponse' | 'ApiResponse' | 'ApiResponseData';
22
- /**
23
- * 根据 returnFormat 映射返回格式
24
- */
25
- export type ReturnFormatMap<RData, T extends ReturnFormat | undefined = undefined> = T extends 'RawResponse' ? RawResponse : T extends 'ApiResponse' ? ApiResponse<RData> : T extends 'ApiResponseData' ? RData : T extends undefined ? RData : never;
26
- //# sourceMappingURL=response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/types/core/response.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,CAAA;CACR;AAED;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG,GAAG,CAAA;AAEjC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAA;AAE5E;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,SAAS,YAAY,GAAG,SAAS,GAAG,SAAS,IAAI,CAAC,SAAS,aAAa,GACxG,WAAW,GACX,CAAC,SAAS,aAAa,GACrB,WAAW,CAAC,KAAK,CAAC,GAClB,CAAC,SAAS,iBAAiB,GACzB,KAAK,GACL,CAAC,SAAS,SAAS,GACjB,KAAK,GACL,KAAK,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=response.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/types/core/response.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import type { UserCookie } from '../types/business/auth.js';
2
- export declare function parseUserCookie(setCookie: string[]): UserCookie;
3
- //# sourceMappingURL=cookies.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE3D,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,CA0B/D"}
@@ -1,26 +0,0 @@
1
- export function parseUserCookie(setCookie) {
2
- if (!setCookie)
3
- throw new Error('setCookie 为空');
4
- const cookies = [];
5
- let bili_jct;
6
- let uid;
7
- for (const cookie of setCookie) {
8
- if (cookie) {
9
- const item = cookie.slice(0, cookie.indexOf(';') + 1);
10
- cookies.push(item);
11
- if (item.startsWith('bili_jct=')) {
12
- bili_jct = item.slice('bili_jct='.length, -1);
13
- }
14
- if (item.startsWith('DedeUserID=')) {
15
- uid = item.slice('DedeUserID='.length, -1);
16
- }
17
- }
18
- }
19
- if (!bili_jct || !uid)
20
- throw new Error('setCookie 解析错误,不存在 bili_jct/uid');
21
- return {
22
- cookie: cookies.join(' '),
23
- bili_jct: bili_jct,
24
- };
25
- }
26
- //# sourceMappingURL=cookies.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,SAAmB;IACjD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;IAE/C,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,QAAQ,CAAA;IACZ,IAAI,GAAG,CAAA;IAEP,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAEzE,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB,QAAQ,EAAE,QAAQ;KACE,CAAA;AACxB,CAAC"}
@@ -1,3 +0,0 @@
1
- export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
2
- export declare function sleepRandom(minMS: number, maxMS: number, signal?: AbortSignal): Promise<void>;
3
- //# sourceMappingURL=time.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AACA,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,iBAqBrD;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,iBAG7E"}
@@ -1,26 +0,0 @@
1
- // 支持取消的 sleep
2
- export function sleep(ms, signal) {
3
- return new Promise((resolve, reject) => {
4
- if (signal?.aborted)
5
- return reject(new Error('取消操作'));
6
- const timer = setTimeout(() => {
7
- cleanup();
8
- resolve();
9
- }, ms);
10
- const onAbort = () => {
11
- clearTimeout(timer);
12
- cleanup();
13
- reject(new Error('取消操作'));
14
- };
15
- const cleanup = () => {
16
- signal?.removeEventListener('abort', onAbort);
17
- };
18
- signal?.addEventListener('abort', onAbort);
19
- });
20
- }
21
- // 支持取消的随机 sleep
22
- export function sleepRandom(minMS, maxMS, signal) {
23
- const ms = Math.random() * (maxMS - minMS) + minMS;
24
- return sleep(ms, signal);
25
- }
26
- //# sourceMappingURL=time.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,CAAA;YACT,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,EAAE,CAAA;YACT,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3B,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC,CAAA;QAED,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,MAAoB;IAC5E,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;IAClD,OAAO,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AAC1B,CAAC"}
@@ -1,31 +0,0 @@
1
- import type { RequestParams } from '../types/core/request.js';
2
- /**
3
- * 解析 url
4
- * @param urlStr
5
- */
6
- export declare function parseURL(urlStr: string): {
7
- baseUrl: string;
8
- searchParams: URLSearchParams;
9
- };
10
- /**
11
- * 编码 URL 参数
12
- * @param params 查询参数
13
- */
14
- export declare function encodeURLParams(params: RequestParams): string;
15
- /**
16
- * wbi 签名
17
- * @param params
18
- */
19
- export declare function wbiSign(params: RequestParams): string;
20
- /**
21
- * 合并查询参数
22
- */
23
- export declare function mergeParams<QParams = RequestParams>(urlSearchParams: URLSearchParams, params?: QParams): RequestParams;
24
- /**
25
- * 处理 url 查询参数
26
- * @param mergedParams 合并后的查询参数
27
- * @param skipWbiSign 是否跳过webi签名
28
- * @return 查询字符串
29
- */
30
- export declare function handleUrlParams(mergedParams: RequestParams, skipWbiSign?: boolean): string;
31
- //# sourceMappingURL=url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAM7D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM;;;EAUtC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,UAgBpD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,UAK5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAG,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO,iBAatG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAoB1F"}
package/dist/utils/url.js DELETED
@@ -1,93 +0,0 @@
1
- import md5 from 'md5';
2
- import { mixinKeyStore } from '../stores/mixinkey.js';
3
- // URL query 中必须编码的保留字符 (RFC 3986)
4
- const invalidCharRegex = /[!'()*]/g;
5
- /**
6
- * 解析 url
7
- * @param urlStr
8
- */
9
- export function parseURL(urlStr) {
10
- try {
11
- const url = new URL(urlStr);
12
- return {
13
- baseUrl: url.origin + url.pathname,
14
- searchParams: url.searchParams,
15
- };
16
- }
17
- catch (_) {
18
- throw new Error('URL 无效');
19
- }
20
- }
21
- /**
22
- * 编码 URL 参数
23
- * @param params 查询参数
24
- */
25
- export function encodeURLParams(params) {
26
- return (Object.keys(params)
27
- // 排序
28
- .sort()
29
- // 编码 key 和 value
30
- .map((key) => {
31
- const raw = params[key];
32
- if (raw === undefined || raw === null)
33
- return '';
34
- const value = String(raw).replace(invalidCharRegex, '');
35
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
36
- })
37
- // 拼接
38
- .join('&'));
39
- }
40
- /**
41
- * wbi 签名
42
- * @param params
43
- */
44
- export function wbiSign(params) {
45
- // 先按要求编码
46
- const query = encodeURLParams(params);
47
- // 再进行签名
48
- return query + '&w_rid=' + md5(query + mixinKeyStore.get());
49
- }
50
- /**
51
- * 合并查询参数
52
- */
53
- export function mergeParams(urlSearchParams, params) {
54
- let mergedParams = {};
55
- if (urlSearchParams.size > 0) {
56
- // 合并url里的查询参数
57
- urlSearchParams.forEach((value, key) => {
58
- mergedParams[key] = value;
59
- });
60
- }
61
- // 处理单独传的查询参数对象
62
- if (params) {
63
- mergedParams = { ...mergedParams, ...params };
64
- }
65
- return mergedParams;
66
- }
67
- /**
68
- * 处理 url 查询参数
69
- * @param mergedParams 合并后的查询参数
70
- * @param skipWbiSign 是否跳过webi签名
71
- * @return 查询字符串
72
- */
73
- export function handleUrlParams(mergedParams, skipWbiSign) {
74
- try {
75
- if (skipWbiSign || Object.keys(mergedParams).length === 0) {
76
- // 简单编码即可
77
- return `${encodeURLParams(mergedParams)}`;
78
- }
79
- // 添加 wts
80
- if (!mergedParams.wts) {
81
- mergedParams = {
82
- ...mergedParams,
83
- wts: Math.floor(Date.now() / 1000),
84
- };
85
- }
86
- // wbi 签名
87
- return `${wbiSign(mergedParams)}`;
88
- }
89
- catch (_) {
90
- throw new Error('查询参数无效');
91
- }
92
- }
93
- //# sourceMappingURL=url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"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"}