@polyv/request-plugin-polyv-business 2.0.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 +118 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/judge.d.ts +22 -0
- package/judge.js +28 -0
- package/package.json +11 -0
- package/polyv-business.d.ts +23 -0
- package/polyv-business.js +96 -0
- package/request-options.d.ts +22 -0
- package/request-options.js +1 -0
- package/types.d.ts +35 -0
- package/types.js +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# PolyvBusinessRequestPlugin
|
|
2
|
+
|
|
3
|
+
用途:保利威业务数据插件,用于在请求中自动插入业务相关的参数。
|
|
4
|
+
|
|
5
|
+
> PS:该插件仅适用于 <span style="color: red">**api.polyv.net**</span> 下的接口
|
|
6
|
+
|
|
7
|
+
## 实例化参数
|
|
8
|
+
|
|
9
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
10
|
+
| - | - | - | - |
|
|
11
|
+
| `usePolyvBusiness` | 是否使用业务数据 | `boolean` | `true` |
|
|
12
|
+
| `getBusinessData` | 获取业务数据的方法 | `function` | - |
|
|
13
|
+
|
|
14
|
+
## 请求选项
|
|
15
|
+
|
|
16
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
17
|
+
| - | - | - | - |
|
|
18
|
+
| `usePolyvBusiness` | 是否使用业务数据 | `boolean` | `true` |
|
|
19
|
+
| `businessData` | 业务数据 | `PolyvBusinessData` | - |
|
|
20
|
+
|
|
21
|
+
## 业务数据类型
|
|
22
|
+
|
|
23
|
+
`PolyvBusinessData` 类型如下:
|
|
24
|
+
|
|
25
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
26
|
+
| - | - | - | - |
|
|
27
|
+
| `sourceType` | 来源类型 | `string` | - |
|
|
28
|
+
| `sourceId` | 来源 id | `string` | - |
|
|
29
|
+
| `channelId` | 频道号 | `string` | - |
|
|
30
|
+
| `viewerId` | 用户 id | `string` | - |
|
|
31
|
+
| `unionId` | 用户系统唯一 id | `string` | - |
|
|
32
|
+
|
|
33
|
+
## 使用方式
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
import { PolyvRequest } from '@polyv/request-core';
|
|
37
|
+
import { PolyvBusinessRequestPlugin } from '@polyv/request-plugin-polyv-business';
|
|
38
|
+
|
|
39
|
+
// 自定义获取业务数据的方法
|
|
40
|
+
const requester = new PolyvRequest({
|
|
41
|
+
requestPlugins: [
|
|
42
|
+
new PolyvBusinessRequestPlugin({
|
|
43
|
+
getBusinessData: async (options) => {
|
|
44
|
+
// 可以在这里实现自定义的业务数据获取逻辑
|
|
45
|
+
return {
|
|
46
|
+
sourceType: 'yourSourceType',
|
|
47
|
+
sourceId: 'yourSourceId',
|
|
48
|
+
channelId: 'yourChannelId',
|
|
49
|
+
viewerId: 'yourViewerId',
|
|
50
|
+
unionId: 'yourUnionId',
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
}),
|
|
54
|
+
]
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// 在某个请求中禁用业务数据
|
|
58
|
+
requester.get('/api/data', {}, {
|
|
59
|
+
usePolyvBusiness: false,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// 在某个请求中使用特定的业务数据
|
|
63
|
+
requester.get('/api/data', {}, {
|
|
64
|
+
businessData: {
|
|
65
|
+
sourceType: 'specificSourceType',
|
|
66
|
+
sourceId: 'specificSourceId',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 插件处理逻辑
|
|
72
|
+
|
|
73
|
+
1. 插件会在请求中自动插入业务相关的参数,如 `sourceType`、`sourceId`、`channelId`、`viewerId`、`unionId` 等
|
|
74
|
+
2. 插件会根据请求的 URL 判断需要插入哪些参数:
|
|
75
|
+
- 对于 `/live/v4/watch/common` 接口,插入 `sourceType` 和 `sourceId`
|
|
76
|
+
- 对于 `/live/v4/watch/viewer` 接口,插入 `sourceType`、`sourceId`、`viewerId` 和 `userId`
|
|
77
|
+
- 对于其他接口,插入 `channelId` 和 `viewerId`
|
|
78
|
+
3. 如果你使用了 `@polyv/request-plugin-authorize-token` 令牌插件,本插件会根据 URL 判断是否使用 token 和 tokenField:
|
|
79
|
+
- 对于 `/live/v4/watch/common` 接口,会自动插入 `useToken` 为 false 禁用 token 插入
|
|
80
|
+
- 对于 `/live/v3` 接口,会将 `tokenField` 设置为 `token`,其他接口设置为 `viewerToken`
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
import { PolyvRequest } from '@polyv/request-core';
|
|
84
|
+
import { AuthorizeTokenRequestPlugin } from '@polyv/request-plugin-authorize-token';
|
|
85
|
+
import { PolyvBusinessRequestPlugin } from '@polyv/request-plugin-polyv-business';
|
|
86
|
+
|
|
87
|
+
const requester = new PolyvRequest({
|
|
88
|
+
baseUrl: 'https://api.polyv.net',
|
|
89
|
+
requestPlugins: [
|
|
90
|
+
new AuthorizeTokenRequestPlugin({
|
|
91
|
+
getTokenInfo: () => {
|
|
92
|
+
return {
|
|
93
|
+
// 只需要传入 token 即可
|
|
94
|
+
token: 'yourToken',
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
new PolyvBusinessRequestPlugin({
|
|
99
|
+
getBusinessData: async (options) => {
|
|
100
|
+
// 可以在这里实现自定义的业务数据获取逻辑
|
|
101
|
+
return {
|
|
102
|
+
channelId: 'yourChannelId',
|
|
103
|
+
viewerId: 'yourViewerId',
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
}),
|
|
107
|
+
]
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// 不会插入 token
|
|
111
|
+
requester.get('/live/v4/watch/common/xxx/xx/x', {});
|
|
112
|
+
|
|
113
|
+
// 会插入 token,token 字段为 'token'
|
|
114
|
+
requester.get('/live/v3/xxx/xx/x', {});
|
|
115
|
+
|
|
116
|
+
// 会插入 token,token 字段为 'viewerToken'
|
|
117
|
+
requester.get('/live/v4/xxx/xx/x', {});
|
|
118
|
+
```
|
package/index.d.ts
ADDED
package/index.js
ADDED
package/judge.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 是否共用接口
|
|
3
|
+
*
|
|
4
|
+
* 判断地址:/live/v4/watch/common
|
|
5
|
+
*
|
|
6
|
+
* 插入参数:sourceId、sourceType
|
|
7
|
+
*/
|
|
8
|
+
export declare function isCommonRequest(url: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 是否观众接口
|
|
11
|
+
*
|
|
12
|
+
* 判断地址:/live/v4/watch/viewer
|
|
13
|
+
*
|
|
14
|
+
* 插入参数:sourceId、sourceType、viewerId、userId
|
|
15
|
+
*/
|
|
16
|
+
export declare function isViewerRequest(url: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 是否 v3 接口,/live/v3 开头的接口,使用 'token' 入参
|
|
19
|
+
*
|
|
20
|
+
* 判断地址:/live/v3
|
|
21
|
+
*/
|
|
22
|
+
export declare function isV3Request(url: string): boolean;
|
package/judge.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 是否共用接口
|
|
3
|
+
*
|
|
4
|
+
* 判断地址:/live/v4/watch/common
|
|
5
|
+
*
|
|
6
|
+
* 插入参数:sourceId、sourceType
|
|
7
|
+
*/
|
|
8
|
+
export function isCommonRequest(url) {
|
|
9
|
+
return url.indexOf('/live/v4/watch/common') !== -1;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 是否观众接口
|
|
13
|
+
*
|
|
14
|
+
* 判断地址:/live/v4/watch/viewer
|
|
15
|
+
*
|
|
16
|
+
* 插入参数:sourceId、sourceType、viewerId、userId
|
|
17
|
+
*/
|
|
18
|
+
export function isViewerRequest(url) {
|
|
19
|
+
return url.indexOf('/live/v4/watch/viewer') !== -1;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 是否 v3 接口,/live/v3 开头的接口,使用 'token' 入参
|
|
23
|
+
*
|
|
24
|
+
* 判断地址:/live/v3
|
|
25
|
+
*/
|
|
26
|
+
export function isV3Request(url) {
|
|
27
|
+
return url.indexOf('/live/v3') !== -1;
|
|
28
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@polyv/request-plugin-polyv-business",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"main": "./index.js",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@polyv/request-core": "2.0.0",
|
|
7
|
+
"@polyv/request-plugin-authorize-token": "2.0.0",
|
|
8
|
+
"@polyv/request-plugin-global-params": "2.0.0"
|
|
9
|
+
},
|
|
10
|
+
"types": "./index.d.ts"
|
|
11
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RequestOptions, RequestPlugin, PluginController } from "@polyv/request-core";
|
|
2
|
+
import { PolyvBusinessRequestPluginConfig } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* 保利威业务数据插件
|
|
5
|
+
*/
|
|
6
|
+
export declare class PolyvBusinessRequestPlugin implements RequestPlugin {
|
|
7
|
+
private __usePolyvBusiness;
|
|
8
|
+
private __config;
|
|
9
|
+
constructor(config: PolyvBusinessRequestPluginConfig);
|
|
10
|
+
installPlugin(pluginController: PluginController): void;
|
|
11
|
+
usePlugin(options: RequestOptions): boolean;
|
|
12
|
+
interceptIncludeParams(options: RequestOptions): void;
|
|
13
|
+
/**
|
|
14
|
+
* 检查业务数据是否存在
|
|
15
|
+
* @param businessData 业务数据
|
|
16
|
+
* @param fields 字段
|
|
17
|
+
*/
|
|
18
|
+
private __checkBusiness;
|
|
19
|
+
/**
|
|
20
|
+
* 获取业务数据
|
|
21
|
+
*/
|
|
22
|
+
private __getBusinessData;
|
|
23
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { GlobalParamsRequestPlugin } from '@polyv/request-plugin-global-params';
|
|
2
|
+
import { isCommonRequest, isV3Request, isViewerRequest } from "./judge";
|
|
3
|
+
/**
|
|
4
|
+
* 保利威业务数据插件
|
|
5
|
+
*/
|
|
6
|
+
export class PolyvBusinessRequestPlugin {
|
|
7
|
+
__usePolyvBusiness;
|
|
8
|
+
__config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.__config = config;
|
|
11
|
+
this.__usePolyvBusiness = config.usePolyvBusiness ?? true;
|
|
12
|
+
}
|
|
13
|
+
installPlugin(pluginController) {
|
|
14
|
+
// 插入全局参数插件
|
|
15
|
+
const globalParamsPlugin = new GlobalParamsRequestPlugin({
|
|
16
|
+
globalParams: async (requestOptions) => {
|
|
17
|
+
const params = {};
|
|
18
|
+
if (!this.usePlugin(requestOptions)) {
|
|
19
|
+
return params;
|
|
20
|
+
}
|
|
21
|
+
const url = requestOptions.url || '';
|
|
22
|
+
const businessData = await this.__getBusinessData(requestOptions);
|
|
23
|
+
if (isCommonRequest(url) && this.__checkBusiness(businessData, ['sourceType', 'sourceId'])) {
|
|
24
|
+
params.sourceType = businessData.sourceType;
|
|
25
|
+
params.sourceId = businessData.sourceId;
|
|
26
|
+
}
|
|
27
|
+
else if (isViewerRequest(url) && this.__checkBusiness(businessData, ['sourceType', 'sourceId', 'viewerId', 'unionId'])) {
|
|
28
|
+
params.sourceType = businessData.sourceType;
|
|
29
|
+
params.sourceId = businessData.sourceId;
|
|
30
|
+
params.viewerId = businessData.viewerId;
|
|
31
|
+
params.userId = businessData.unionId;
|
|
32
|
+
}
|
|
33
|
+
else if (this.__checkBusiness(businessData, ['channelId', 'viewerId'])) {
|
|
34
|
+
params.channelId = businessData.channelId;
|
|
35
|
+
params.viewerId = businessData.viewerId;
|
|
36
|
+
}
|
|
37
|
+
return params;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
pluginController.installPlugin(globalParamsPlugin);
|
|
41
|
+
}
|
|
42
|
+
usePlugin(options) {
|
|
43
|
+
const { usePolyvBusiness = this.__usePolyvBusiness } = options;
|
|
44
|
+
return usePolyvBusiness;
|
|
45
|
+
}
|
|
46
|
+
// 在注入阶段处理 token 的参数
|
|
47
|
+
interceptIncludeParams(options) {
|
|
48
|
+
const url = options.url || '';
|
|
49
|
+
options = options;
|
|
50
|
+
// 公共 api 接口,无需授权参数
|
|
51
|
+
if (isCommonRequest(url)) {
|
|
52
|
+
options.useToken = false;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!options.tokenInfo) {
|
|
56
|
+
options.tokenInfo = {};
|
|
57
|
+
}
|
|
58
|
+
// 如果 tokenField 未设置,则根据 url 设置
|
|
59
|
+
if (!options.tokenInfo.tokenField) {
|
|
60
|
+
let tokenField = 'viewerToken';
|
|
61
|
+
if (isV3Request(url)) {
|
|
62
|
+
tokenField = 'token';
|
|
63
|
+
}
|
|
64
|
+
options.tokenInfo.tokenField = tokenField;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 检查业务数据是否存在
|
|
69
|
+
* @param businessData 业务数据
|
|
70
|
+
* @param fields 字段
|
|
71
|
+
*/
|
|
72
|
+
__checkBusiness(businessData, fields) {
|
|
73
|
+
for (let i = 0; i < fields.length; i++) {
|
|
74
|
+
const field = fields[i];
|
|
75
|
+
const data = businessData[field];
|
|
76
|
+
if (!data) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 获取业务数据
|
|
84
|
+
*/
|
|
85
|
+
async __getBusinessData(options) {
|
|
86
|
+
let businessData = {};
|
|
87
|
+
if (typeof this.__config.getBusinessData === 'function') {
|
|
88
|
+
const res = await this.__config.getBusinessData(options) || {};
|
|
89
|
+
businessData = { ...businessData, ...res };
|
|
90
|
+
}
|
|
91
|
+
if (options.businessData) {
|
|
92
|
+
businessData = { ...businessData, ...options.businessData };
|
|
93
|
+
}
|
|
94
|
+
return businessData;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PolyvBusinessData } from "./types";
|
|
2
|
+
export interface PolyvBusinessRequestPluginOptions {
|
|
3
|
+
/**
|
|
4
|
+
* 是否使用业务数据
|
|
5
|
+
* @default true
|
|
6
|
+
* @plugin `PolyvBusinessRequestPlugin`
|
|
7
|
+
*/
|
|
8
|
+
usePolyvBusiness?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 业务数据
|
|
11
|
+
* @plugin `PolyvBusinessRequestPlugin`
|
|
12
|
+
*/
|
|
13
|
+
businessData?: PolyvBusinessData;
|
|
14
|
+
}
|
|
15
|
+
declare module '@polyv/request-core' {
|
|
16
|
+
interface RequestCustomOptions extends PolyvBusinessRequestPluginOptions {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
declare module 'axios' {
|
|
20
|
+
interface AxiosRequestConfig extends PolyvBusinessRequestPluginOptions {
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RequestOptions } from "@polyv/request-core";
|
|
2
|
+
export interface PolyvBusinessRequestPluginConfig {
|
|
3
|
+
/**
|
|
4
|
+
* 是否使用业务数据
|
|
5
|
+
* @default true
|
|
6
|
+
*/
|
|
7
|
+
usePolyvBusiness?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 获取业务数据
|
|
10
|
+
*/
|
|
11
|
+
getBusinessData?: GetBusinessDataFn;
|
|
12
|
+
}
|
|
13
|
+
export type GetBusinessDataFn = (options: RequestOptions) => Promise<PolyvBusinessData | void> | PolyvBusinessData | void;
|
|
14
|
+
export interface PolyvBusinessData {
|
|
15
|
+
/**
|
|
16
|
+
* 来源类型
|
|
17
|
+
*/
|
|
18
|
+
sourceType?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 来源 id
|
|
21
|
+
*/
|
|
22
|
+
sourceId?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 频道号
|
|
25
|
+
*/
|
|
26
|
+
channelId?: string;
|
|
27
|
+
/**
|
|
28
|
+
* 用户 id
|
|
29
|
+
*/
|
|
30
|
+
viewerId?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 用户系统唯一 id
|
|
33
|
+
*/
|
|
34
|
+
unionId?: string;
|
|
35
|
+
}
|
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|