@solar-taro/baidu 1.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/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # baidu
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Building
6
+
7
+ Run `nx build baidu` to build the library.
8
+
9
+ ## Running unit tests
10
+
11
+ Run `nx test baidu` to execute the unit tests via [Vitest](https://vitest.dev/).
@@ -0,0 +1,5 @@
1
+ import type { HttpInterceptorFn } from '@ngify/http';
2
+ /**
3
+ * 负责百度 `ORC` 接口的认证
4
+ */
5
+ export declare function useBaiduAuthInterceptor(): HttpInterceptorFn;
@@ -0,0 +1,47 @@
1
+ import { HttpStatusCode } from '@ngify/http';
2
+ import { catchError, finalize, share, switchMap } from 'rxjs';
3
+ import { baiduBCEAuthService } from './auth.service.js';
4
+ /**
5
+ * 负责百度 `ORC` 接口的认证
6
+ */
7
+ export function useBaiduAuthInterceptor() {
8
+ let refresher = null;
9
+ /**
10
+ * 获取访问令牌
11
+ */
12
+ function getToken() {
13
+ refresher = baiduBCEAuthService().auth().pipe(finalize(() => refresher = null), share());
14
+ }
15
+ /**
16
+ * 等待令牌后再发送请求
17
+ * @param request
18
+ * @param next
19
+ */
20
+ function waitToken(request, next) {
21
+ return refresher.pipe(switchMap(({ access_token }) => (next(request.clone({
22
+ params: request.params.set('access_token', access_token)
23
+ })))));
24
+ }
25
+ return (request, next) => {
26
+ const token = baiduBCEAuthService().token;
27
+ if (!(token === null || token === void 0 ? void 0 : token.accessToken) && !refresher) {
28
+ getToken();
29
+ }
30
+ if (refresher) {
31
+ return waitToken(request, next);
32
+ }
33
+ request = request.clone({
34
+ params: request.params.set('access_token', token.accessToken)
35
+ });
36
+ return next(request).pipe(catchError((error) => {
37
+ if (error.status === HttpStatusCode.Unauthorized) {
38
+ if (!refresher) {
39
+ getToken();
40
+ }
41
+ return waitToken(request, next);
42
+ }
43
+ throw error;
44
+ }));
45
+ };
46
+ }
47
+ //# sourceMappingURL=auth.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.interceptor.js","sourceRoot":"","sources":["../../../packages/baidu/src/auth.interceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAc,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,SAAS,GAAoE,IAAI,CAAC;IAEtF;;OAEG;IACH,SAAS,QAAQ;QACf,SAAS,GAAG,mBAAmB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAC3C,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,EAChC,KAAK,EAAE,CACR,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,SAAS,CAAC,OAA6B,EAAE,IAAmB;QACnE,OAAO,SAAU,CAAC,IAAI,CACpB,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC;SACzD,CAAC,CAAC,CACJ,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAA6B,EAAE,IAAmB,EAAkC,EAAE;QAC5F,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC,KAAK,CAAC;QAE1C,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,CAAA,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC;SAC9D,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,YAAY,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAED,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { AuthTokens } from '.yalc/@solar-kit/planets/sun';
2
+ import type { BaiduAuth } from './model';
3
+ export interface BaiduConfig {
4
+ /** 公匙 */
5
+ key: string;
6
+ /** 私匙 */
7
+ secret: string;
8
+ }
9
+ export declare const setupBaiduBCEAuth: (config: BaiduConfig) => void, baiduBCEAuthService: () => BaiduBCEAuthService;
10
+ export declare class BaiduBCEAuthService {
11
+ protected config: BaiduConfig;
12
+ private readonly http;
13
+ private _token;
14
+ get token(): AuthTokens;
15
+ private set token(value);
16
+ constructor(config: BaiduConfig);
17
+ auth(): import("rxjs").Observable<BaiduAuth>;
18
+ }
@@ -0,0 +1,35 @@
1
+ import { HttpClient } from '@ngify/http';
2
+ import { defineService } from '@solar-taro/core';
3
+ import { getStorageSync, setStorage } from '@tarojs/taro';
4
+ import { tap } from 'rxjs';
5
+ const TOKEN_STORAGE_KEY = 'baidubce-token';
6
+ export const [setupBaiduBCEAuth, baiduBCEAuthService] = defineService((config) => new BaiduBCEAuthService(config));
7
+ export class BaiduBCEAuthService {
8
+ get token() {
9
+ return this._token;
10
+ }
11
+ set token(value) {
12
+ this._token = value;
13
+ setStorage({
14
+ key: TOKEN_STORAGE_KEY,
15
+ data: value
16
+ });
17
+ }
18
+ constructor(config) {
19
+ this.config = config;
20
+ this.http = new HttpClient();
21
+ this._token = getStorageSync(TOKEN_STORAGE_KEY) || {};
22
+ }
23
+ auth() {
24
+ return this.http.get('https://aip.baidubce.com/oauth/2.0/token', {
25
+ params: {
26
+ grant_type: 'client_credentials',
27
+ client_id: this.config.key,
28
+ client_secret: this.config.secret
29
+ }
30
+ }).pipe(tap(o => {
31
+ this.token = { accessToken: o.access_token };
32
+ }));
33
+ }
34
+ }
35
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../packages/baidu/src/auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAU3B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAE3C,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,aAAa,CAAC,CAAC,MAAmB,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhI,MAAM,OAAO,mBAAmB;IAI9B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAY,KAAK,CAAC,KAAiB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,UAAU,CAAC;YACT,GAAG,EAAE,iBAAiB;YACtB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,YACY,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAhBd,SAAI,GAAG,IAAI,UAAU,EAAE,CAAA;QAChC,WAAM,GAAe,cAAc,CAAa,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAgB7E,CAAC;IAEL,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAY,0CAA0C,EAAE;YAC1E,MAAM,EAAE;gBACN,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;gBAC1B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAClC;SACF,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,EAAE;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './auth.interceptor';
2
+ export * from './interceptor';
3
+ export * from './service';
package/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './auth.interceptor.js';
2
+ export * from './interceptor.js';
3
+ export * from './service.js';
4
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/baidu/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { HttpInterceptorFn } from '@ngify/http';
2
+ /**
3
+ * 负责百度 `ORC` 接口的拦截
4
+ * - 添加 `Content-Type` 请求头
5
+ * - 捕获响应异常并提示
6
+ */
7
+ export declare function useBaiduInterceptor(): HttpInterceptorFn;
package/interceptor.js ADDED
@@ -0,0 +1,33 @@
1
+ import { HttpResponse } from '@ngify/http';
2
+ import { overlay, vibrator } from '@solar-taro/core';
3
+ import { catchError, finalize, of, switchMap } from 'rxjs';
4
+ /**
5
+ * 负责百度 `ORC` 接口的拦截
6
+ * - 添加 `Content-Type` 请求头
7
+ * - 捕获响应异常并提示
8
+ */
9
+ export function useBaiduInterceptor() {
10
+ return (request, next) => {
11
+ const ctrl = overlay.loading('正在识别');
12
+ request = request.clone({
13
+ headers: request.headers.set('Content-Type', 'application/x-www-form-urlencoded')
14
+ });
15
+ return next(request).pipe(switchMap((event) => {
16
+ if (event instanceof HttpResponse) {
17
+ if (event.body.words_result_num < 1) {
18
+ vibrator.short();
19
+ overlay.tips('识别失败,原因:错误的图片类型');
20
+ throw event;
21
+ }
22
+ overlay.success('识别成功');
23
+ }
24
+ return of(event);
25
+ }), catchError((error) => {
26
+ if (![200, 401].includes(error.status)) {
27
+ overlay.tips('识别失败,状态码:' + error.status || '未知');
28
+ }
29
+ throw error;
30
+ }), finalize(() => ctrl.dismiss()));
31
+ };
32
+ }
33
+ //# sourceMappingURL=interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../../packages/baidu/src/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,YAAY,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAc,EAAE,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGvE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,OAA6B,EAAE,IAAmB,EAAkC,EAAE;QAC5F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,mCAAmC,CAAC;SAClF,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,IAAK,KAAK,CAAC,IAAiB,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBAClD,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAChC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YAED,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,EACF,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAC/B,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
package/model.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ export interface BaiduOCR {
2
+ idcard_number_type: number;
3
+ image_status: string;
4
+ words_result_num: number;
5
+ words_result: Record<string, {
6
+ words: string;
7
+ location: {
8
+ top: number;
9
+ left: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ }>;
14
+ }
15
+ export interface BaiduAuth {
16
+ access_token: string;
17
+ expires_in: number;
18
+ }
package/model.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
package/model.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../packages/baidu/src/model.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@solar-taro/baidu",
3
+ "version": "1.0.2",
4
+ "sideEffects": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "peerDependencies": {
12
+ "@ngify/http": "^2.0.0",
13
+ "@ngify/http-wx": "^2.0.0",
14
+ "rxjs": "^7.8.0"
15
+ },
16
+ "types": "./index.d.ts",
17
+ "module": "./index.js",
18
+ "type": "module",
19
+ "main": "./index.js"
20
+ }
package/service.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { HttpClient } from '@ngify/http';
2
+ import { BaiduConfig } from './auth.service';
3
+ import type { BaiduOCR } from './model';
4
+ export declare const setupBaiduOCR: (config: BaiduConfig) => void, baiduOCRService: () => BaiduOCRService;
5
+ export declare class BaiduOCRService {
6
+ protected readonly http: HttpClient;
7
+ /**
8
+ * 识别营业执照
9
+ * @param image base64
10
+ */
11
+ parseLicense(image: string): import("rxjs").Observable<BaiduOCR>;
12
+ /**
13
+ * 识别身份证
14
+ * @param image base64
15
+ */
16
+ parseIdcard(image: string): import("rxjs").Observable<BaiduOCR>;
17
+ }
package/service.js ADDED
@@ -0,0 +1,33 @@
1
+ import { HttpClient, withInterceptors } from '@ngify/http';
2
+ import { defineService } from '@solar-taro/core';
3
+ import { useBaiduAuthInterceptor } from './auth.interceptor.js';
4
+ import { setupBaiduBCEAuth } from './auth.service.js';
5
+ import { useBaiduInterceptor } from './interceptor.js';
6
+ const BAIDU_OCR_URL = 'https://aip.baidubce.com/rest/2.0/ocr/v1';
7
+ export const [setupBaiduOCR, baiduOCRService] = defineService((config) => {
8
+ setupBaiduBCEAuth(config);
9
+ return new BaiduOCRService();
10
+ });
11
+ export class BaiduOCRService {
12
+ constructor() {
13
+ this.http = new HttpClient(withInterceptors([
14
+ useBaiduInterceptor(),
15
+ useBaiduAuthInterceptor()
16
+ ]));
17
+ }
18
+ /**
19
+ * 识别营业执照
20
+ * @param image base64
21
+ */
22
+ parseLicense(image) {
23
+ return this.http.post(BAIDU_OCR_URL + '/business_license', { image });
24
+ }
25
+ /**
26
+ * 识别身份证
27
+ * @param image base64
28
+ */
29
+ parseIdcard(image) {
30
+ return this.http.post(BAIDU_OCR_URL + '/idcard', { image, id_card_side: 'front' });
31
+ }
32
+ }
33
+ //# sourceMappingURL=service.js.map
package/service.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../packages/baidu/src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAe,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAEjE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC,MAAmB,EAAE,EAAE;IACpF,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IAA5B;QACqB,SAAI,GAAG,IAAI,UAAU,CACtC,gBAAgB,CAAC;YACf,mBAAmB,EAAE;YACrB,uBAAuB,EAAE;SAC1B,CAAC,CACH,CAAC;IAiBJ,CAAC;IAfC;;;OAGG;IACH,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAW,aAAa,GAAG,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAW,aAAa,GAAG,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF"}