hik-iot-sdk 1.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.
Files changed (50) hide show
  1. package/README.md +467 -0
  2. package/dist/core/__tests__/crypto.test.d.ts +1 -0
  3. package/dist/core/__tests__/crypto.test.js +68 -0
  4. package/dist/core/auth.d.ts +51 -0
  5. package/dist/core/auth.js +292 -0
  6. package/dist/core/config.d.ts +31 -0
  7. package/dist/core/config.js +11 -0
  8. package/dist/core/crypto.d.ts +12 -0
  9. package/dist/core/crypto.js +88 -0
  10. package/dist/core/errors.d.ts +45 -0
  11. package/dist/core/errors.js +61 -0
  12. package/dist/core/http.d.ts +29 -0
  13. package/dist/core/http.js +134 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.js +10 -0
  16. package/dist/modules/access/access.schema.d.ts +2307 -0
  17. package/dist/modules/access/access.schema.js +353 -0
  18. package/dist/modules/access/access.service.d.ts +55 -0
  19. package/dist/modules/access/access.service.js +145 -0
  20. package/dist/modules/access/access.types.d.ts +307 -0
  21. package/dist/modules/access/access.types.js +3 -0
  22. package/dist/modules/access/index.d.ts +2 -0
  23. package/dist/modules/access/index.js +20 -0
  24. package/dist/modules/card/card.schema.d.ts +27 -0
  25. package/dist/modules/card/card.schema.js +12 -0
  26. package/dist/modules/card/card.service.d.ts +10 -0
  27. package/dist/modules/card/card.service.js +50 -0
  28. package/dist/modules/card/card.types.d.ts +18 -0
  29. package/dist/modules/card/card.types.js +2 -0
  30. package/dist/modules/device/device.schema.d.ts +258 -0
  31. package/dist/modules/device/device.schema.js +44 -0
  32. package/dist/modules/device/device.service.d.ts +14 -0
  33. package/dist/modules/device/device.service.js +69 -0
  34. package/dist/modules/device/device.types.d.ts +46 -0
  35. package/dist/modules/device/device.types.js +2 -0
  36. package/dist/modules/face/face.schema.d.ts +27 -0
  37. package/dist/modules/face/face.schema.js +12 -0
  38. package/dist/modules/face/face.service.d.ts +9 -0
  39. package/dist/modules/face/face.service.js +42 -0
  40. package/dist/modules/face/face.types.d.ts +17 -0
  41. package/dist/modules/face/face.types.js +2 -0
  42. package/dist/modules/person/person.schema.d.ts +270 -0
  43. package/dist/modules/person/person.schema.js +42 -0
  44. package/dist/modules/person/person.service.d.ts +16 -0
  45. package/dist/modules/person/person.service.js +88 -0
  46. package/dist/modules/person/person.types.d.ts +65 -0
  47. package/dist/modules/person/person.types.js +2 -0
  48. package/dist/sdk.d.ts +60 -0
  49. package/dist/sdk.js +106 -0
  50. package/package.json +29 -0
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const pino_1 = __importDefault(require("pino"));
9
+ const zod_1 = require("zod");
10
+ const errors_1 = require("./errors");
11
+ const crypto_1 = require("./crypto");
12
+ const logger = (0, pino_1.default)({ name: 'hik-http' });
13
+ const BaseResponseSchema = zod_1.z.object({
14
+ code: zod_1.z.number(),
15
+ msg: zod_1.z.string(),
16
+ data: zod_1.z.unknown().optional(),
17
+ detail: zod_1.z.string().optional().nullable(),
18
+ count: zod_1.z.number().optional(),
19
+ });
20
+ class HttpClient {
21
+ constructor(config, authManager) {
22
+ this.config = config;
23
+ this.authManager = authManager;
24
+ this.crypto = new crypto_1.HikCrypto(config.appSecret);
25
+ this.client = axios_1.default.create({
26
+ baseURL: config.baseUrl,
27
+ timeout: config.timeout,
28
+ headers: {
29
+ 'Content-Type': 'application/json',
30
+ },
31
+ });
32
+ this.setupInterceptors();
33
+ }
34
+ setupInterceptors() {
35
+ this.client.interceptors.request.use(async (config) => {
36
+ const appAccessToken = await this.authManager.getAppAccessToken();
37
+ config.headers = config.headers ?? {};
38
+ config.headers['App-Access-Token'] = appAccessToken;
39
+ const userAccessToken = await this.authManager.getUserAccessToken();
40
+ config.headers['User-Access-Token'] = userAccessToken;
41
+ logger.debug({
42
+ method: config.method,
43
+ url: config.url,
44
+ data: config.data,
45
+ }, 'HTTP Request');
46
+ return config;
47
+ }, (error) => {
48
+ logger.error({ error }, 'Request interceptor error');
49
+ return Promise.reject(error);
50
+ });
51
+ this.client.interceptors.response.use((response) => {
52
+ logger.debug({
53
+ status: response.status,
54
+ data: response.data,
55
+ }, 'HTTP Response');
56
+ return response;
57
+ }, async (error) => {
58
+ if (axios_1.default.isAxiosError(error) && error.response) {
59
+ const { status, data } = error.response;
60
+ const errorCode = typeof data === 'object' &&
61
+ data !== null &&
62
+ 'code' in data &&
63
+ typeof data.code === 'number'
64
+ ? data.code
65
+ : undefined;
66
+ if (status === 401 || errorCode === errors_1.ERROR_CODES.INVALID_APP_ACCESS_TOKEN) {
67
+ logger.info('Token expired, refreshing and retrying');
68
+ this.authManager.clearAppToken();
69
+ const originalRequest = error.config;
70
+ if (originalRequest && !originalRequest._retry) {
71
+ originalRequest._retry = true;
72
+ const newToken = await this.authManager.getAppAccessToken();
73
+ originalRequest.headers = originalRequest.headers ?? {};
74
+ originalRequest.headers['App-Access-Token'] = newToken;
75
+ return this.client(originalRequest);
76
+ }
77
+ }
78
+ logger.error({ status, data }, 'HTTP Error Response');
79
+ }
80
+ return Promise.reject(error);
81
+ });
82
+ }
83
+ async post(path, data, schema) {
84
+ let requestData = data;
85
+ // 加密请求体
86
+ if (this.config.enableEncrypt && data && Object.keys(data).length > 0) {
87
+ requestData = this.crypto.encryptBody(data);
88
+ }
89
+ const response = await this.client.post(path, requestData);
90
+ return this.handleResponse(response, schema);
91
+ }
92
+ async get(path, config, schema) {
93
+ let requestConfig = config || {};
94
+ // 加密查询参数
95
+ if (this.config.enableEncrypt && requestConfig.params && Object.keys(requestConfig.params).length > 0) {
96
+ const querySecret = this.crypto.encryptParams(requestConfig.params);
97
+ requestConfig = { ...requestConfig, params: { querySecret } };
98
+ }
99
+ const response = await this.client.get(path, requestConfig);
100
+ return this.handleResponse(response, schema);
101
+ }
102
+ handleResponse(response, schema) {
103
+ let responseData = response.data;
104
+ // 解密响应数据
105
+ if (this.config.enableEncrypt && responseData.data && typeof responseData.data === 'string') {
106
+ try {
107
+ const decryptedData = this.crypto.decrypt(responseData.data);
108
+ responseData = {
109
+ ...responseData,
110
+ data: JSON.parse(decryptedData),
111
+ };
112
+ }
113
+ catch (error) {
114
+ logger.warn({ error }, 'Failed to decrypt response data');
115
+ }
116
+ }
117
+ const baseResult = BaseResponseSchema.parse(responseData);
118
+ if (baseResult.code !== 0) {
119
+ if (baseResult.code >= 160000 && baseResult.code < 170000) {
120
+ throw new errors_1.HikDeviceError(baseResult.code, baseResult.msg, baseResult.detail ?? undefined);
121
+ }
122
+ throw errors_1.HikError.fromResponse({
123
+ code: baseResult.code,
124
+ msg: baseResult.msg,
125
+ detail: baseResult.detail ?? undefined,
126
+ });
127
+ }
128
+ if (schema) {
129
+ return schema.parse(responseData);
130
+ }
131
+ return responseData;
132
+ }
133
+ }
134
+ exports.HttpClient = HttpClient;
@@ -0,0 +1,8 @@
1
+ export { HikSdk } from './sdk';
2
+ export { HikError, HikAuthError, HikDeviceError, ERROR_CODES } from './core/errors';
3
+ export type { HikConfig, HikSdkOptions } from './core/config';
4
+ export type { CreatePersonInput, DeletePersonInput, BatchDeletePersonInput, SearchPersonInput, PersonInfo, PersonValid, PersonRightPlan, DoorRightPlan, TraceIdResponse, UserType, } from './modules/person/person.types';
5
+ export type { AddFaceInput, DeleteFaceInput, FaceTraceIdResponse, FaceLibType, } from './modules/face/face.types';
6
+ export type { AddCardInput, DeleteCardInput, BatchDeleteCardInput, CardTraceIdResponse, CardType, } from './modules/card/card.types';
7
+ export type { RemoteControlDoorInput, GetDoorStatusInput, GetStorageCountInput, ClearStorageInput, DoorStatusResponse, StorageCountResponse, StorageCount, DeviceTraceIdResponse, DoorControlCmd, ControlType, } from './modules/device/device.types';
8
+ export type { PersonRef, DeviceRef, AddAuthorityConfigInput, UpdateAuthorityConfigInput, AuthorityConfigDetail, AuthorityConfigListItem, SaveDeviceGroupInput, DeviceGroupDetail, PersonDevicePageInput, PersonDeviceItem, WaitIssueInfo, PasswordInfo, ManualIssueInput, SelectIssueInput, CoverIssueInput, AccessEventPageInput, AccessEventItem, AuthPicUrlInput, AuthPicUrlResult, HolidayGroupInput, UpdateHolidayGroupInput, HolidayGroupDetail, TimePlanInput, UpdateTimePlanInput, TimePlanDetail, InfoStatus, DoorVO, WorkdayPeriod, WorkdayDetail, PersonResponse, DeviceResponse, } from './modules/access/access.types';
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ERROR_CODES = exports.HikDeviceError = exports.HikAuthError = exports.HikError = exports.HikSdk = void 0;
4
+ var sdk_1 = require("./sdk");
5
+ Object.defineProperty(exports, "HikSdk", { enumerable: true, get: function () { return sdk_1.HikSdk; } });
6
+ var errors_1 = require("./core/errors");
7
+ Object.defineProperty(exports, "HikError", { enumerable: true, get: function () { return errors_1.HikError; } });
8
+ Object.defineProperty(exports, "HikAuthError", { enumerable: true, get: function () { return errors_1.HikAuthError; } });
9
+ Object.defineProperty(exports, "HikDeviceError", { enumerable: true, get: function () { return errors_1.HikDeviceError; } });
10
+ Object.defineProperty(exports, "ERROR_CODES", { enumerable: true, get: function () { return errors_1.ERROR_CODES; } });