questverify-cert-sdk 1.0.1
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 +122 -0
- package/dist/AuthManager.d.ts +40 -0
- package/dist/AuthManager.d.ts.map +1 -0
- package/dist/AuthManager.js +188 -0
- package/dist/AuthManager.js.map +1 -0
- package/dist/CertSDK.d.ts +93 -0
- package/dist/CertSDK.d.ts.map +1 -0
- package/dist/CertSDK.js +416 -0
- package/dist/CertSDK.js.map +1 -0
- package/dist/CryptographicSigner.d.ts +31 -0
- package/dist/CryptographicSigner.d.ts.map +1 -0
- package/dist/CryptographicSigner.js +138 -0
- package/dist/CryptographicSigner.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +57 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +123 -0
- package/dist/logger.js.map +1 -0
- package/dist/types.d.ts +230 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +54 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +312 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +48 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +216 -0
- package/dist/validation.js.map +1 -0
- package/package.json +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# QuestVerify Certificate SDK
|
|
2
|
+
|
|
3
|
+
Server-side SDK for QuestVerify blockchain certificate platform.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @questverify/cert-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { CertSDK } from '@questverify/cert-sdk';
|
|
15
|
+
|
|
16
|
+
const sdk = new CertSDK({
|
|
17
|
+
environment: 'sandbox', // or 'production'
|
|
18
|
+
clientId: 'your-client-id',
|
|
19
|
+
clientSecret: 'your-client-secret',
|
|
20
|
+
privateKey: 'your-secp256k1-private-key-hex', // 64 character hex string
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Upload PDF
|
|
24
|
+
const result = await sdk.uploadPDF({
|
|
25
|
+
pdf: Buffer.from('...'), // or file path
|
|
26
|
+
filename: 'certificate.pdf',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
console.log('Batch ID:', result.batchId);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## API Reference
|
|
33
|
+
|
|
34
|
+
### Upload PDF
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
await sdk.uploadPDF({
|
|
38
|
+
pdf: Buffer | string,
|
|
39
|
+
filename?: string,
|
|
40
|
+
metadata?: Record<string, any>,
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Upload CSV
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
await sdk.uploadCSV({
|
|
48
|
+
csv: Buffer | string,
|
|
49
|
+
templateId: string,
|
|
50
|
+
fieldMapping?: Record<string, string>,
|
|
51
|
+
filename?: string,
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Upload JSON
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
await sdk.uploadJSON({
|
|
59
|
+
data: Array<Record<string, any>>,
|
|
60
|
+
templateId: string,
|
|
61
|
+
fieldMapping?: Record<string, string>,
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Verify PDF
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
await sdk.verifyPDF({
|
|
69
|
+
pdf: Buffer | string,
|
|
70
|
+
filename?: string,
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Batch Status
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
await sdk.getBatchStatus('batch-uuid');
|
|
78
|
+
await sdk.waitForBatchCompletion('batch-uuid', { interval?: number, timeout?: number });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Configuration
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
interface SDKConfig {
|
|
85
|
+
environment: 'sandbox' | 'production';
|
|
86
|
+
clientId: string;
|
|
87
|
+
clientSecret: string;
|
|
88
|
+
privateKey: string; // secp256k1 private key in hex format (64 chars)
|
|
89
|
+
baseUrl?: string;
|
|
90
|
+
timeout?: number; // default: 30000
|
|
91
|
+
retry?: {
|
|
92
|
+
maxAttempts?: number; // default: 3
|
|
93
|
+
delay?: number; // default: 1000
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Error Handling
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { SDKError, SDKErrorCode } from '@questverify/cert-sdk';
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
await sdk.uploadPDF({ pdf: buffer });
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (error instanceof SDKError) {
|
|
107
|
+
console.error(error.code, error.message);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Error Codes:** `AUTHENTICATION_FAILED`, `INVALID_CREDENTIALS`, `INVALID_PDF`, `INVALID_CSV`, `TEMPLATE_NOT_FOUND`, `NETWORK_ERROR`, `TIMEOUT`, `VALIDATION_ERROR`, `UNKNOWN_ERROR`
|
|
113
|
+
|
|
114
|
+
## Security
|
|
115
|
+
|
|
116
|
+
- Never commit private keys to version control
|
|
117
|
+
- Use environment variables for sensitive configuration
|
|
118
|
+
- Use different keys for sandbox and production
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
MIT
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { SDKConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Authentication Manager
|
|
5
|
+
* Handles token acquisition, refresh, and automatic retry on 401
|
|
6
|
+
*/
|
|
7
|
+
export declare class AuthManager {
|
|
8
|
+
private accessToken;
|
|
9
|
+
private refreshToken;
|
|
10
|
+
private tokenExpiry;
|
|
11
|
+
private refreshPromise;
|
|
12
|
+
private config;
|
|
13
|
+
private axiosInstance;
|
|
14
|
+
constructor(config: SDKConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Get valid access token (auto-refresh if needed)
|
|
17
|
+
*/
|
|
18
|
+
getAccessToken(): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Authenticate and get tokens
|
|
21
|
+
*/
|
|
22
|
+
private authenticate;
|
|
23
|
+
/**
|
|
24
|
+
* Refresh access token using refresh token
|
|
25
|
+
*/
|
|
26
|
+
private refreshAccessToken;
|
|
27
|
+
/**
|
|
28
|
+
* Make authenticated request with auto-retry on 401
|
|
29
|
+
*/
|
|
30
|
+
request<T>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', url: string, data?: any, headers?: Record<string, string>): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Get axios instance with authentication
|
|
33
|
+
*/
|
|
34
|
+
getAxiosInstance(): AxiosInstance;
|
|
35
|
+
/**
|
|
36
|
+
* Clear tokens (for logout/testing)
|
|
37
|
+
*/
|
|
38
|
+
clearTokens(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAyC,MAAM,SAAS,CAAC;AAG3E;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,MAAM,EAAE,SAAS;IAQ7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAsBvC;;OAEG;YACW,YAAY;IAyC1B;;OAEG;YACW,kBAAkB;IAwChC;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAmEb;;OAEG;IACH,gBAAgB,IAAI,aAAa;IAIjC;;OAEG;IACH,WAAW,IAAI,IAAI;CAKpB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
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.AuthManager = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const config_1 = require("./config");
|
|
10
|
+
/**
|
|
11
|
+
* Authentication Manager
|
|
12
|
+
* Handles token acquisition, refresh, and automatic retry on 401
|
|
13
|
+
*/
|
|
14
|
+
class AuthManager {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.accessToken = null;
|
|
17
|
+
this.refreshToken = null;
|
|
18
|
+
this.tokenExpiry = 0;
|
|
19
|
+
this.refreshPromise = null;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.axiosInstance = axios_1.default.create({
|
|
22
|
+
baseURL: (0, config_1.getBaseUrl)(config),
|
|
23
|
+
timeout: config.timeout,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get valid access token (auto-refresh if needed)
|
|
28
|
+
*/
|
|
29
|
+
async getAccessToken() {
|
|
30
|
+
// If we have a valid token, return it
|
|
31
|
+
if (this.accessToken && Date.now() < this.tokenExpiry - 60000) {
|
|
32
|
+
// Refresh 1 minute before expiry
|
|
33
|
+
return this.accessToken;
|
|
34
|
+
}
|
|
35
|
+
// If refresh is already in progress, wait for it
|
|
36
|
+
if (this.refreshPromise) {
|
|
37
|
+
return this.refreshPromise;
|
|
38
|
+
}
|
|
39
|
+
// Start new refresh
|
|
40
|
+
this.refreshPromise = this.refreshAccessToken();
|
|
41
|
+
try {
|
|
42
|
+
const token = await this.refreshPromise;
|
|
43
|
+
return token;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
this.refreshPromise = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Authenticate and get tokens
|
|
51
|
+
*/
|
|
52
|
+
async authenticate() {
|
|
53
|
+
try {
|
|
54
|
+
const response = await this.axiosInstance.post('/api/auth/client/token', {
|
|
55
|
+
clientId: this.config.clientId,
|
|
56
|
+
clientSecret: this.config.clientSecret,
|
|
57
|
+
});
|
|
58
|
+
if (!response.data.success || !response.data.data) {
|
|
59
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.AUTHENTICATION_FAILED, 'Authentication failed: Invalid response from server');
|
|
60
|
+
}
|
|
61
|
+
return response.data.data;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
65
|
+
if (error.response?.status === 401) {
|
|
66
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_CREDENTIALS, 'Invalid client credentials', error);
|
|
67
|
+
}
|
|
68
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.AUTHENTICATION_FAILED, `Authentication failed: ${error.message}`, error);
|
|
69
|
+
}
|
|
70
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.AUTHENTICATION_FAILED, `Authentication failed: ${error.message}`, error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Refresh access token using refresh token
|
|
75
|
+
*/
|
|
76
|
+
async refreshAccessToken() {
|
|
77
|
+
// If no refresh token, authenticate fresh
|
|
78
|
+
if (!this.refreshToken) {
|
|
79
|
+
const tokens = await this.authenticate();
|
|
80
|
+
this.accessToken = tokens.accessToken;
|
|
81
|
+
this.refreshToken = tokens.refreshToken;
|
|
82
|
+
this.tokenExpiry = Date.now() + tokens.expiresIn * 1000;
|
|
83
|
+
return this.accessToken;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const response = await this.axiosInstance.post('/api/auth/client/refresh', {
|
|
87
|
+
refreshToken: this.refreshToken,
|
|
88
|
+
});
|
|
89
|
+
if (!response.data.success || !response.data.data) {
|
|
90
|
+
// Refresh token invalid, authenticate fresh
|
|
91
|
+
const tokens = await this.authenticate();
|
|
92
|
+
this.accessToken = tokens.accessToken;
|
|
93
|
+
this.refreshToken = tokens.refreshToken;
|
|
94
|
+
this.tokenExpiry = Date.now() + tokens.expiresIn * 1000;
|
|
95
|
+
return this.accessToken;
|
|
96
|
+
}
|
|
97
|
+
this.accessToken = response.data.data.accessToken;
|
|
98
|
+
this.tokenExpiry = Date.now() + response.data.data.expiresIn * 1000;
|
|
99
|
+
return this.accessToken;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Refresh failed, authenticate fresh
|
|
103
|
+
const tokens = await this.authenticate();
|
|
104
|
+
this.accessToken = tokens.accessToken;
|
|
105
|
+
this.refreshToken = tokens.refreshToken;
|
|
106
|
+
this.tokenExpiry = Date.now() + tokens.expiresIn * 1000;
|
|
107
|
+
return this.accessToken;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Make authenticated request with auto-retry on 401
|
|
112
|
+
*/
|
|
113
|
+
async request(method, url, data, headers) {
|
|
114
|
+
const token = await this.getAccessToken();
|
|
115
|
+
try {
|
|
116
|
+
// Handle FormData specially
|
|
117
|
+
const requestHeaders = {
|
|
118
|
+
Authorization: `Bearer ${token}`,
|
|
119
|
+
};
|
|
120
|
+
// If data is FormData, don't set Content-Type (let FormData set it with boundary)
|
|
121
|
+
if (data && typeof data.getHeaders === 'function') {
|
|
122
|
+
// FormData object
|
|
123
|
+
const formDataHeaders = data.getHeaders();
|
|
124
|
+
Object.assign(requestHeaders, formDataHeaders);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Regular JSON data
|
|
128
|
+
requestHeaders['Content-Type'] = 'application/json';
|
|
129
|
+
}
|
|
130
|
+
// Merge with custom headers (custom headers take precedence)
|
|
131
|
+
if (headers) {
|
|
132
|
+
Object.assign(requestHeaders, headers);
|
|
133
|
+
}
|
|
134
|
+
const response = await this.axiosInstance.request({
|
|
135
|
+
method,
|
|
136
|
+
url,
|
|
137
|
+
data,
|
|
138
|
+
headers: requestHeaders,
|
|
139
|
+
});
|
|
140
|
+
return response.data;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (axios_1.default.isAxiosError(error) && error.response?.status === 401) {
|
|
144
|
+
// Token expired, refresh and retry once
|
|
145
|
+
this.accessToken = null; // Force refresh
|
|
146
|
+
const newToken = await this.getAccessToken();
|
|
147
|
+
// Rebuild headers for retry
|
|
148
|
+
const retryHeaders = {
|
|
149
|
+
Authorization: `Bearer ${newToken}`,
|
|
150
|
+
};
|
|
151
|
+
if (data && typeof data.getHeaders === 'function') {
|
|
152
|
+
const formDataHeaders = data.getHeaders();
|
|
153
|
+
Object.assign(retryHeaders, formDataHeaders);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
retryHeaders['Content-Type'] = 'application/json';
|
|
157
|
+
}
|
|
158
|
+
if (headers) {
|
|
159
|
+
Object.assign(retryHeaders, headers);
|
|
160
|
+
}
|
|
161
|
+
const retryResponse = await this.axiosInstance.request({
|
|
162
|
+
method,
|
|
163
|
+
url,
|
|
164
|
+
data,
|
|
165
|
+
headers: retryHeaders,
|
|
166
|
+
});
|
|
167
|
+
return retryResponse.data;
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get axios instance with authentication
|
|
174
|
+
*/
|
|
175
|
+
getAxiosInstance() {
|
|
176
|
+
return this.axiosInstance;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Clear tokens (for logout/testing)
|
|
180
|
+
*/
|
|
181
|
+
clearTokens() {
|
|
182
|
+
this.accessToken = null;
|
|
183
|
+
this.refreshToken = null;
|
|
184
|
+
this.tokenExpiry = 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.AuthManager = AuthManager;
|
|
188
|
+
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,mCAA2E;AAC3E,qCAAsC;AAEtC;;;GAGG;AACH,MAAa,WAAW;IAQtB,YAAY,MAAiB;QAPrB,gBAAW,GAAkB,IAAI,CAAC;QAClC,iBAAY,GAAkB,IAAI,CAAC;QACnC,gBAAW,GAAW,CAAC,CAAC;QACxB,mBAAc,GAA2B,IAAI,CAAC;QAKpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,eAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,IAAA,mBAAU,EAAC,MAAM,CAAC;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,sCAAsC;QACtC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,EAAE,CAAC;YAC9D,iCAAiC;YACjC,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAG3C,wBAAwB,EAAE;gBAC3B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;aACvC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,IAAI,gBAAQ,CAChB,oBAAY,CAAC,qBAAqB,EAClC,qDAAqD,CACtD,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,MAAM,IAAI,gBAAQ,CAChB,oBAAY,CAAC,mBAAmB,EAChC,4BAA4B,EAC5B,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,gBAAQ,CAChB,oBAAY,CAAC,qBAAqB,EAClC,0BAA0B,KAAK,CAAC,OAAO,EAAE,EACzC,KAAK,CACN,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,gBAAQ,CAChB,oBAAY,CAAC,qBAAqB,EAClC,0BAA0B,KAAK,CAAC,OAAO,EAAE,EACzC,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC9B,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxD,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAG3C,0BAA0B,EAAE;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,4CAA4C;gBAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;gBACxD,OAAO,IAAI,CAAC,WAAW,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACpE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,qCAAqC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxD,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,MAAyC,EACzC,GAAW,EACX,IAAU,EACV,OAAgC;QAEhC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,cAAc,GAA2B;gBAC7C,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC,CAAC;YAEF,kFAAkF;YAClF,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBAClD,kBAAkB;gBAClB,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,cAAc,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YACtD,CAAC;YAED,6DAA6D;YAC7D,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAI;gBACnD,MAAM;gBACN,GAAG;gBACH,IAAI;gBACJ,OAAO,EAAE,cAAc;aACxB,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBAChE,wCAAwC;gBACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,gBAAgB;gBACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAE7C,4BAA4B;gBAC5B,MAAM,YAAY,GAA2B;oBAC3C,aAAa,EAAE,UAAU,QAAQ,EAAE;iBACpC,CAAC;gBAEF,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBAClD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;gBACpD,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAI;oBACxD,MAAM;oBACN,GAAG;oBACH,IAAI;oBACJ,OAAO,EAAE,YAAY;iBACtB,CAAC,CAAC;gBAEH,OAAO,aAAa,CAAC,IAAI,CAAC;YAC5B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;CACF;AA1ND,kCA0NC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { SDKConfig, UploadPDFOptions, UploadPDFResult, UploadCSVOptions, UploadCSVResult, UploadJSONOptions, VerifyPDFOptions, VerificationResult, BatchStatus, BatchDetails } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* QuestVerify Certificate SDK
|
|
4
|
+
* Main SDK class for blockchain certificate operations
|
|
5
|
+
*/
|
|
6
|
+
export declare class CertSDK {
|
|
7
|
+
private config;
|
|
8
|
+
private authManager;
|
|
9
|
+
private signer;
|
|
10
|
+
private axiosInstance;
|
|
11
|
+
constructor(config: SDKConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Upload single or multiple PDFs for certificate issuance
|
|
14
|
+
*/
|
|
15
|
+
uploadPDF(options: UploadPDFOptions): Promise<UploadPDFResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Upload multiple PDFs (ZIP file or array of buffers)
|
|
18
|
+
*/
|
|
19
|
+
uploadPDFs(pdfs: Array<Buffer | string>): Promise<{
|
|
20
|
+
batchId: string;
|
|
21
|
+
totalRecords: number;
|
|
22
|
+
jobs: Array<{
|
|
23
|
+
jobId: string;
|
|
24
|
+
filename: string;
|
|
25
|
+
status: string;
|
|
26
|
+
}>;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Upload CSV file for bulk certificate issuance
|
|
30
|
+
*/
|
|
31
|
+
uploadCSV(options: UploadCSVOptions): Promise<UploadCSVResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Upload JSON data for bulk certificate issuance
|
|
34
|
+
*/
|
|
35
|
+
uploadJSON(options: UploadJSONOptions): Promise<UploadCSVResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Verify PDF certificate
|
|
38
|
+
*/
|
|
39
|
+
verifyPDF(options: VerifyPDFOptions): Promise<VerificationResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Get batch status
|
|
42
|
+
*/
|
|
43
|
+
getBatchStatus(batchId: string): Promise<BatchStatus>;
|
|
44
|
+
/**
|
|
45
|
+
* Wait for batch to complete (polling)
|
|
46
|
+
*/
|
|
47
|
+
waitForBatchCompletion(batchId: string, options?: {
|
|
48
|
+
interval?: number;
|
|
49
|
+
timeout?: number;
|
|
50
|
+
}): Promise<BatchStatus>;
|
|
51
|
+
/**
|
|
52
|
+
* Get full batch details including job IDs.
|
|
53
|
+
* Useful for downloading generated PDFs after a batch completes.
|
|
54
|
+
*/
|
|
55
|
+
getBatchDetails(batchId: string): Promise<BatchDetails>;
|
|
56
|
+
/**
|
|
57
|
+
* Download the generated (QR/VD embedded) certificate PDF for a job.
|
|
58
|
+
*/
|
|
59
|
+
downloadJobPDF(jobId: string): Promise<Buffer>;
|
|
60
|
+
/**
|
|
61
|
+
* Download all certificates in a batch as a ZIP file.
|
|
62
|
+
*/
|
|
63
|
+
downloadBatchZIP(batchId: string): Promise<Buffer>;
|
|
64
|
+
/**
|
|
65
|
+
* Trigger email sending for a batch.
|
|
66
|
+
*/
|
|
67
|
+
emailBatch(options: {
|
|
68
|
+
batchId: string;
|
|
69
|
+
sendZipTo?: string;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
success: boolean;
|
|
72
|
+
message: string;
|
|
73
|
+
type: 'zip' | 'individual';
|
|
74
|
+
stats?: {
|
|
75
|
+
sent: number;
|
|
76
|
+
failed: number;
|
|
77
|
+
skipped: number;
|
|
78
|
+
};
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Get public key (for verification/display)
|
|
82
|
+
*/
|
|
83
|
+
getPublicKey(compressed?: boolean): Buffer;
|
|
84
|
+
/**
|
|
85
|
+
* Hash data (utility method)
|
|
86
|
+
*/
|
|
87
|
+
hashData(data: Buffer | string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Sign data (utility method)
|
|
90
|
+
*/
|
|
91
|
+
signData(data: Buffer | string): string;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=CertSDK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertSDK.d.ts","sourceRoot":"","sources":["../src/CertSDK.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,YAAY,EAGb,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,aAAa,CAAgB;gBAEzB,MAAM,EAAE,SAAS;IAe7B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAwEpE;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC;QACtD,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC;IAUF;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsGpE;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IA6GtE;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuEvE;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2B3D;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,WAAW,CAAC;IAuBvB;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB7D;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBpD;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBxD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC1E,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,KAAK,GAAG,YAAY,CAAC;QAC3B,KAAK,CAAC,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IAgCF;;OAEG;IACH,YAAY,CAAC,UAAU,GAAE,OAAc,GAAG,MAAM;IAUhD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;CASxC"}
|