@nicksakerin/eimzo 0.1.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 +448 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +174 -0
- package/dist/config.js.map +1 -0
- package/dist/eimzo.d.ts +14 -0
- package/dist/eimzo.d.ts.map +1 -0
- package/dist/eimzo.js +142 -0
- package/dist/eimzo.js.map +1 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +19 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +19 -0
- package/dist/messages.js.map +1 -0
- package/dist/sign/attach.d.ts +11 -0
- package/dist/sign/attach.d.ts.map +1 -0
- package/dist/sign/attach.js +46 -0
- package/dist/sign/attach.js.map +1 -0
- package/dist/sign/getAcceptSignature.d.ts +15 -0
- package/dist/sign/getAcceptSignature.d.ts.map +1 -0
- package/dist/sign/getAcceptSignature.js +90 -0
- package/dist/sign/getAcceptSignature.js.map +1 -0
- package/dist/sign/getSignature.d.ts +12 -0
- package/dist/sign/getSignature.d.ts.map +1 -0
- package/dist/sign/getSignature.js +66 -0
- package/dist/sign/getSignature.js.map +1 -0
- package/dist/sign/index.d.ts +8 -0
- package/dist/sign/index.d.ts.map +1 -0
- package/dist/sign/index.js +8 -0
- package/dist/sign/index.js.map +1 -0
- package/dist/sign/keyLoaders.d.ts +21 -0
- package/dist/sign/keyLoaders.d.ts.map +1 -0
- package/dist/sign/keyLoaders.js +87 -0
- package/dist/sign/keyLoaders.js.map +1 -0
- package/dist/sign/pkcs7.d.ts +33 -0
- package/dist/sign/pkcs7.d.ts.map +1 -0
- package/dist/sign/pkcs7.js +182 -0
- package/dist/sign/pkcs7.js.map +1 -0
- package/dist/sign/sign.d.ts +11 -0
- package/dist/sign/sign.d.ts.map +1 -0
- package/dist/sign/sign.js +42 -0
- package/dist/sign/sign.js.map +1 -0
- package/dist/sign/types.d.ts +48 -0
- package/dist/sign/types.d.ts.map +1 -0
- package/dist/sign/types.js +3 -0
- package/dist/sign/types.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/parseData.d.ts +13 -0
- package/dist/utils/parseData.d.ts.map +1 -0
- package/dist/utils/parseData.js +96 -0
- package/dist/utils/parseData.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# @sakerin/eimzo
|
|
2
|
+
|
|
3
|
+
Библиотека для работы с клиентом EIMZO (электронная цифровая подпись для Узбекистана).
|
|
4
|
+
|
|
5
|
+
## Установка
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sakerin/eimzo
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Требования
|
|
12
|
+
|
|
13
|
+
- Установленный и запущенный клиент EIMZO
|
|
14
|
+
- Современный браузер с поддержкой WebSocket
|
|
15
|
+
|
|
16
|
+
## Быстрый старт
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import {
|
|
20
|
+
startApi,
|
|
21
|
+
getAllCertificates,
|
|
22
|
+
sign,
|
|
23
|
+
setDefaultKeyId,
|
|
24
|
+
setConfig,
|
|
25
|
+
} from '@sakerin/eimzo';
|
|
26
|
+
|
|
27
|
+
// 1. Инициализация API
|
|
28
|
+
const initResult = await startApi();
|
|
29
|
+
if (!initResult.success) {
|
|
30
|
+
console.error('Ошибка инициализации:', initResult.error);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 2. Настройка timestamper (опционально)
|
|
35
|
+
setConfig({
|
|
36
|
+
timestamper: (signatureHex, pkcs7, callback, onReject) => {
|
|
37
|
+
fetch('https://example.uz/timestamp', {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/json' },
|
|
40
|
+
body: JSON.stringify({ signatureHex, pkcs7 }),
|
|
41
|
+
})
|
|
42
|
+
.then((res) => res.json())
|
|
43
|
+
.then((data) => callback(data))
|
|
44
|
+
.catch((err) => onReject(err));
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// 3. Установка ИНН по умолчанию (опционально)
|
|
49
|
+
setDefaultKeyId('123456789');
|
|
50
|
+
|
|
51
|
+
// 4. Получение сертификатов
|
|
52
|
+
const certsResult = await getAllCertificates();
|
|
53
|
+
if (certsResult.success) {
|
|
54
|
+
console.log('Найдено сертификатов:', certsResult.data.length);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 5. Подписание данных
|
|
58
|
+
const signResult = await sign('Данные для подписания');
|
|
59
|
+
if (signResult.success) {
|
|
60
|
+
console.log('Подпись создана:', signResult.data.signature);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## API
|
|
65
|
+
|
|
66
|
+
### Инициализация
|
|
67
|
+
|
|
68
|
+
#### `startApi(domainAndKey?: string[])`
|
|
69
|
+
|
|
70
|
+
Инициализирует API EIMZO с токенами доступа.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const result = await startApi();
|
|
74
|
+
// или с кастомными токенами
|
|
75
|
+
const result = await startApi(['domain1', 'key1', 'domain2', 'key2']);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### `getInitialized(): boolean`
|
|
79
|
+
|
|
80
|
+
Проверяет, инициализирован ли API.
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
if (getInitialized()) {
|
|
84
|
+
// API готов к использованию
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### `reset()`
|
|
89
|
+
|
|
90
|
+
Сбрасывает состояние инициализации и очищает конфигурацию.
|
|
91
|
+
|
|
92
|
+
### Работа с сертификатами
|
|
93
|
+
|
|
94
|
+
#### `getAllCertificates(uid?: string)`
|
|
95
|
+
|
|
96
|
+
Получает все доступные сертификаты (из certkey и pfx источников).
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// Все сертификаты
|
|
100
|
+
const result = await getAllCertificates();
|
|
101
|
+
|
|
102
|
+
// Сертификаты по ИНН
|
|
103
|
+
const result = await getAllCertificates('123456789');
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Возвращает `Result<ICert[], EimzoError>` где `ICert` содержит:
|
|
107
|
+
- `inn` - ИНН
|
|
108
|
+
- `serialNumber` - серийный номер
|
|
109
|
+
- `type` - тип сертификата ('certkey' | 'pfx')
|
|
110
|
+
- `overdue` - просрочен ли сертификат
|
|
111
|
+
- `parsedAlias` - распарсенные данные из alias
|
|
112
|
+
|
|
113
|
+
#### `getEimzoUSBTokens()`
|
|
114
|
+
|
|
115
|
+
Получает список доступных USB-токенов (CKC устройств).
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const result = await getEimzoUSBTokens();
|
|
119
|
+
if (result.success) {
|
|
120
|
+
console.log('USB-токены:', result.data);
|
|
121
|
+
// ['CKC - DEVICE-001', 'IDCARD - DEVICE-002']
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Подписание
|
|
126
|
+
|
|
127
|
+
#### `sign(data: string, signer?: Signer, options?: SignOptions)`
|
|
128
|
+
|
|
129
|
+
Подписывает данные. Если `signer` не указан, используется сохраненный `defaultKeyId`.
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
// Подписание с автоматическим выбором сертификата (по defaultKeyId)
|
|
133
|
+
const result = await sign('Данные для подписания');
|
|
134
|
+
|
|
135
|
+
// Подписание с конкретным сертификатом
|
|
136
|
+
const certsResult = await getAllCertificates();
|
|
137
|
+
if (certsResult.success && certsResult.data.length > 0) {
|
|
138
|
+
const result = await sign('Данные', certsResult.data[0]);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Подписание с USB-токеном
|
|
142
|
+
const result = await sign('Данные', 'idcard'); // или 'ckc'
|
|
143
|
+
|
|
144
|
+
// Подписание с опциями
|
|
145
|
+
const result = await sign('Данные', cert, {
|
|
146
|
+
isBase64: true, // данные уже в base64
|
|
147
|
+
useTimestamp: true, // добавить временную метку
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### `attach(existingPkcs7: string, signer?: Signer, options?: AttachOptions)`
|
|
152
|
+
|
|
153
|
+
Присоединяет подпись к существующей PKCS7 подписи.
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// Присоединение подписи
|
|
157
|
+
const result = await attach(existingSignature, cert);
|
|
158
|
+
|
|
159
|
+
// С опцией ignoreSearch (игнорировать поиск сертификата)
|
|
160
|
+
const result = await attach(existingSignature, cert, {
|
|
161
|
+
ignoreSearch: true,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Для USB-токенов с originalString
|
|
165
|
+
const result = await attach(existingSignature, 'idcard', {
|
|
166
|
+
originalString: 'Оригинальные данные',
|
|
167
|
+
joinSignatures: async (existingPkcs7, newSignature) => {
|
|
168
|
+
// Логика объединения подписей
|
|
169
|
+
const response = await fetch('/api/join-signatures', {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
body: JSON.stringify({ existingPkcs7, newSignature }),
|
|
172
|
+
});
|
|
173
|
+
return { success: true, data: { pkcs7B64: await response.text() } };
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Управление идентификатором ключа по умолчанию
|
|
179
|
+
|
|
180
|
+
#### `setDefaultKeyId(keyId: string)`
|
|
181
|
+
|
|
182
|
+
Устанавливает идентификатор ключа по умолчанию (ИНН или 'idcard'/'ckc').
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// Для сертификата
|
|
186
|
+
setDefaultKeyId('123456789');
|
|
187
|
+
|
|
188
|
+
// Для USB-токена
|
|
189
|
+
setDefaultKeyId('idcard');
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
#### `getDefaultKeyId(): string | undefined`
|
|
193
|
+
|
|
194
|
+
Получает сохраненный идентификатор ключа.
|
|
195
|
+
|
|
196
|
+
#### `clearDefaultKeyId()`
|
|
197
|
+
|
|
198
|
+
Очищает сохраненный идентификатор ключа.
|
|
199
|
+
|
|
200
|
+
### Конфигурация
|
|
201
|
+
|
|
202
|
+
#### `setConfig(config: EimzoConfig)`
|
|
203
|
+
|
|
204
|
+
Устанавливает конфигурацию библиотеки.
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
setConfig({
|
|
208
|
+
domainAndKey: ['domain1', 'key1', 'domain2', 'key2'],
|
|
209
|
+
timestamper: (signatureHex, pkcs7, callback, onReject) => {
|
|
210
|
+
// Логика получения timestamp
|
|
211
|
+
fetch('https://example.uz/timestamp', {
|
|
212
|
+
method: 'POST',
|
|
213
|
+
headers: { 'Content-Type': 'application/json' },
|
|
214
|
+
body: JSON.stringify({ signatureHex, pkcs7 }),
|
|
215
|
+
})
|
|
216
|
+
.then((res) => res.json())
|
|
217
|
+
.then((data) => callback(data))
|
|
218
|
+
.catch((err) => onReject(err));
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
#### `getTimestamper(): TimestamperFunction | undefined`
|
|
224
|
+
|
|
225
|
+
Получает установленную функцию timestamper.
|
|
226
|
+
|
|
227
|
+
## Типы
|
|
228
|
+
|
|
229
|
+
### `ICert`
|
|
230
|
+
|
|
231
|
+
Интерфейс сертификата:
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
interface ICert {
|
|
235
|
+
inn: string;
|
|
236
|
+
serialNumber: string;
|
|
237
|
+
type?: 'certkey' | 'pfx' | 'idcard' | 'ckc';
|
|
238
|
+
overdue?: boolean;
|
|
239
|
+
parsedAlias?: {
|
|
240
|
+
cn: string;
|
|
241
|
+
o: string;
|
|
242
|
+
validto: string;
|
|
243
|
+
'1.2.860.3.16.1.2'?: string; // ПИНФЛ
|
|
244
|
+
};
|
|
245
|
+
disk?: string;
|
|
246
|
+
path?: string;
|
|
247
|
+
name?: string;
|
|
248
|
+
alias?: string;
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### `SignOptions`
|
|
253
|
+
|
|
254
|
+
Опции для подписания:
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
interface SignOptions {
|
|
258
|
+
isBase64?: boolean; // данные уже в base64
|
|
259
|
+
useTimestamp?: boolean; // использовать временную метку
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### `SignResult`
|
|
264
|
+
|
|
265
|
+
Результат подписания:
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
interface SignResult {
|
|
269
|
+
signature: string; // PKCS7 подпись в base64
|
|
270
|
+
signerSerialNumber?: string; // серийный номер подписанта
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### `Result<T, E>`
|
|
275
|
+
|
|
276
|
+
Result Pattern для обработки ошибок:
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
type Result<T, E> =
|
|
280
|
+
| { success: true; data: T }
|
|
281
|
+
| { success: false; error: E };
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Обработка ошибок
|
|
285
|
+
|
|
286
|
+
Библиотека использует Result Pattern для обработки ошибок. Все функции возвращают `Result<T, EimzoError>`.
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const result = await sign('Данные');
|
|
290
|
+
|
|
291
|
+
if (result.success) {
|
|
292
|
+
// Успех
|
|
293
|
+
console.log(result.data.signature);
|
|
294
|
+
} else {
|
|
295
|
+
// Ошибка
|
|
296
|
+
console.error('Код ошибки:', result.error.code);
|
|
297
|
+
console.error('Сообщение:', result.error.message);
|
|
298
|
+
console.error('Детали:', result.error.details);
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Коды ошибок
|
|
303
|
+
|
|
304
|
+
- `INITIALIZATION_FAILED` - ошибка инициализации API
|
|
305
|
+
- `CERTIFICATE_NOT_FOUND` - сертификат не найден
|
|
306
|
+
- `PASSWORD_INCORRECT` - неверный пароль
|
|
307
|
+
- `EIMZO_SERVICE_ERROR` - ошибка сервиса EIMZO
|
|
308
|
+
- `TIMESTAMP_ERROR` - ошибка получения timestamp
|
|
309
|
+
- `SIGNATURE_ERROR` - ошибка создания подписи
|
|
310
|
+
- `KEY_LOAD_FAILED` - ошибка загрузки ключа
|
|
311
|
+
- `TIMESTAMP_ATTACH_FAILED` - ошибка добавления timestamp
|
|
312
|
+
- `INVALID_CERTIFICATE_TYPE` - неверный тип сертификата
|
|
313
|
+
- `INVALID_PARAMETERS` - неверные параметры
|
|
314
|
+
- `UNKNOWN_ERROR` - неизвестная ошибка
|
|
315
|
+
|
|
316
|
+
## Примеры использования
|
|
317
|
+
|
|
318
|
+
### Полный цикл работы
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
import {
|
|
322
|
+
startApi,
|
|
323
|
+
setConfig,
|
|
324
|
+
setDefaultKeyId,
|
|
325
|
+
getAllCertificates,
|
|
326
|
+
sign,
|
|
327
|
+
clearDefaultKeyId,
|
|
328
|
+
} from '@sakerin/eimzo';
|
|
329
|
+
|
|
330
|
+
async function main() {
|
|
331
|
+
// 1. Инициализация
|
|
332
|
+
const initResult = await startApi();
|
|
333
|
+
if (!initResult.success) {
|
|
334
|
+
throw initResult.error;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// 2. Настройка timestamper
|
|
338
|
+
setConfig({
|
|
339
|
+
timestamper: (signatureHex, pkcs7, callback, onReject) => {
|
|
340
|
+
fetch('https://example.uz/timestamp', {
|
|
341
|
+
method: 'POST',
|
|
342
|
+
headers: { 'Content-Type': 'application/json' },
|
|
343
|
+
body: JSON.stringify({ signatureHex, pkcs7 }),
|
|
344
|
+
})
|
|
345
|
+
.then((res) => res.json())
|
|
346
|
+
.then((data) => callback(data))
|
|
347
|
+
.catch((err) => onReject(err));
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
// 3. Установка ИНН по умолчанию
|
|
352
|
+
setDefaultKeyId('123456789');
|
|
353
|
+
|
|
354
|
+
// 4. Получение сертификатов
|
|
355
|
+
const certsResult = await getAllCertificates();
|
|
356
|
+
if (!certsResult.success) {
|
|
357
|
+
throw certsResult.error;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
console.log('Найдено сертификатов:', certsResult.data.length);
|
|
361
|
+
|
|
362
|
+
// 5. Подписание
|
|
363
|
+
const signResult = await sign('Важные данные для подписания');
|
|
364
|
+
if (signResult.success) {
|
|
365
|
+
console.log('Подпись создана успешно!');
|
|
366
|
+
console.log('Длина подписи:', signResult.data.signature.length);
|
|
367
|
+
} else {
|
|
368
|
+
console.error('Ошибка подписания:', signResult.error);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// 6. Очистка (при выходе)
|
|
372
|
+
clearDefaultKeyId();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
main();
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Работа с USB-токенами
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
import { getEimzoUSBTokens, sign } from '@sakerin/eimzo';
|
|
382
|
+
|
|
383
|
+
// Получение списка USB-токенов
|
|
384
|
+
const tokensResult = await getEimzoUSBTokens();
|
|
385
|
+
if (tokensResult.success) {
|
|
386
|
+
console.log('Доступные USB-токены:', tokensResult.data);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Подписание с USB-токеном
|
|
390
|
+
const signResult = await sign('Данные', 'idcard');
|
|
391
|
+
// или
|
|
392
|
+
const signResult = await sign('Данные', 'ckc');
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Присоединение нескольких подписей
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
import { sign, attach } from '@sakerin/eimzo';
|
|
399
|
+
|
|
400
|
+
// Первая подпись
|
|
401
|
+
const firstResult = await sign('Документ', cert1);
|
|
402
|
+
if (!firstResult.success) throw firstResult.error;
|
|
403
|
+
|
|
404
|
+
// Вторая подпись (присоединение)
|
|
405
|
+
const secondResult = await attach(firstResult.data.signature, cert2);
|
|
406
|
+
if (!secondResult.success) throw secondResult.error;
|
|
407
|
+
|
|
408
|
+
console.log('Документ подписан двумя подписями');
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Разработка
|
|
412
|
+
|
|
413
|
+
### Установка зависимостей
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
npm install
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Сборка
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
npm run build
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Тестирование
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Запуск тестов
|
|
429
|
+
npm test
|
|
430
|
+
|
|
431
|
+
# Запуск в режиме watch
|
|
432
|
+
npm run test:watch
|
|
433
|
+
|
|
434
|
+
# Запуск с UI
|
|
435
|
+
npm run test:ui
|
|
436
|
+
|
|
437
|
+
# Запуск с покрытием
|
|
438
|
+
npm run test:coverage
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Лицензия
|
|
442
|
+
|
|
443
|
+
ISC
|
|
444
|
+
|
|
445
|
+
## Автор
|
|
446
|
+
|
|
447
|
+
Nikita Sakerin
|
|
448
|
+
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Result, EimzoError } from './errors';
|
|
2
|
+
import { EimzoConfig, TimestamperFunction } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Инициализация API EIMZO с токенами
|
|
5
|
+
* @param domainAndKey - массив доменов и ключей [domain1, key1, domain2, key2, ...]
|
|
6
|
+
* @returns Promise с результатом инициализации
|
|
7
|
+
*/
|
|
8
|
+
export declare function startApi(domainAndKey?: string[]): Promise<Result<void, EimzoError>>;
|
|
9
|
+
/**
|
|
10
|
+
* Получить статус инициализации
|
|
11
|
+
* @returns true если API успешно инициализирован
|
|
12
|
+
*/
|
|
13
|
+
export declare function getInitialized(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Сбросить статус инициализации
|
|
16
|
+
*/
|
|
17
|
+
export declare function reset(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Установить конфигурацию
|
|
20
|
+
* @param config - конфигурация EIMZO
|
|
21
|
+
*/
|
|
22
|
+
export declare function setConfig(config: EimzoConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* Получить функцию timestamper из конфигурации
|
|
25
|
+
* @returns функция timestamper или undefined
|
|
26
|
+
*/
|
|
27
|
+
export declare function getTimestamper(): TimestamperFunction | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Установить идентификатор ключа по умолчанию
|
|
30
|
+
* @param keyId - ИНН для сертификатов или 'idcard'/'ckc' для USB-токенов
|
|
31
|
+
*/
|
|
32
|
+
export declare function setDefaultKeyId(keyId: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Получить идентификатор ключа по умолчанию
|
|
35
|
+
* @returns идентификатор ключа или undefined
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDefaultKeyId(): string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Очистить идентификатор ключа по умолчанию
|
|
40
|
+
*/
|
|
41
|
+
export declare function clearDefaultKeyId(): void;
|
|
42
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAiK3D;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAEnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAE5B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,mBAAmB,GAAG,SAAS,CAEhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Управление конфигурацией и инициализацией EIMZO
|
|
2
|
+
import { CAPIWS } from './vendors/e-imzo';
|
|
3
|
+
import { EimzoError, EimzoErrorCode, ok, err } from './errors';
|
|
4
|
+
/**
|
|
5
|
+
* Предустановленные токены по умолчанию
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_DOMAIN_AND_KEY = [
|
|
8
|
+
'localhost',
|
|
9
|
+
'96D0C1491615C82B9A54D9989779DF825B690748224C2B04F500F370D51827CE2644D8D4A82C18184D73AB8530BB8ED537269603F61DB0D03D2104ABF789970B',
|
|
10
|
+
'127.0.0.1',
|
|
11
|
+
'A7BCFA5D490B351BE0754130DF03A068F855DB4333D43921125B9CF2670EF6A40370C646B90401955E1F7BC9CDBF59CE0B2C5467D820BE189C845D0B79CFC96F',
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Класс для управления конфигурацией и инициализацией EIMZO
|
|
15
|
+
*/
|
|
16
|
+
class EimzoConfigManager {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.isInitialized = false;
|
|
19
|
+
this.domainAndKey = [];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Инициализация API EIMZO с токенами
|
|
23
|
+
* @param domainAndKey - массив доменов и ключей [domain1, key1, domain2, key2, ...]
|
|
24
|
+
* @returns Promise с результатом инициализации
|
|
25
|
+
*/
|
|
26
|
+
async startApi(domainAndKey) {
|
|
27
|
+
try {
|
|
28
|
+
// Используем переданные токены, сохраненные из конфигурации или предустановленные по умолчанию
|
|
29
|
+
const tokens = domainAndKey || this.domainAndKey || DEFAULT_DOMAIN_AND_KEY;
|
|
30
|
+
// Проверяем, что количество элементов четное (домен + ключ)
|
|
31
|
+
if (tokens.length % 2 !== 0) {
|
|
32
|
+
return err(new EimzoError(EimzoErrorCode.INVALID_PARAMETERS, 'Количество токенов должно быть четным (домен + ключ)'));
|
|
33
|
+
}
|
|
34
|
+
// Сохраняем токены для последующего использования
|
|
35
|
+
if (domainAndKey) {
|
|
36
|
+
this.domainAndKey = domainAndKey;
|
|
37
|
+
}
|
|
38
|
+
// Инициализируем API через CAPIWS.apikey
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
CAPIWS.apikey(tokens, (_event, data) => {
|
|
41
|
+
// Проверяем успешность инициализации
|
|
42
|
+
if (data && !data.error) {
|
|
43
|
+
this.isInitialized = true;
|
|
44
|
+
resolve(ok(undefined));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.isInitialized = false;
|
|
48
|
+
resolve(err(new EimzoError(EimzoErrorCode.INITIALIZATION_FAILED, data?.reason || 'Ошибка инициализации EIMZO API', data)));
|
|
49
|
+
}
|
|
50
|
+
}, (error) => {
|
|
51
|
+
this.isInitialized = false;
|
|
52
|
+
resolve(err(new EimzoError(EimzoErrorCode.INITIALIZATION_FAILED, 'Не удалось подключиться к EIMZO сервису', error)));
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
this.isInitialized = false;
|
|
58
|
+
return err(new EimzoError(EimzoErrorCode.INITIALIZATION_FAILED, 'Неожиданная ошибка при инициализации', error));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Получить статус инициализации
|
|
63
|
+
* @returns true если API успешно инициализирован
|
|
64
|
+
*/
|
|
65
|
+
getInitialized() {
|
|
66
|
+
return this.isInitialized;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Сбросить статус инициализации
|
|
70
|
+
*/
|
|
71
|
+
reset() {
|
|
72
|
+
this.isInitialized = false;
|
|
73
|
+
this.domainAndKey = [];
|
|
74
|
+
this.timestamper = undefined;
|
|
75
|
+
this.defaultKeyId = undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Установить конфигурацию
|
|
79
|
+
* @param config - конфигурация EIMZO
|
|
80
|
+
*/
|
|
81
|
+
setConfig(config) {
|
|
82
|
+
if (config.domainAndKey) {
|
|
83
|
+
this.domainAndKey = config.domainAndKey;
|
|
84
|
+
}
|
|
85
|
+
if (config.timestamper !== undefined) {
|
|
86
|
+
this.timestamper = config.timestamper;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Получить функцию timestamper
|
|
91
|
+
* @returns функция timestamper или undefined
|
|
92
|
+
*/
|
|
93
|
+
getTimestamper() {
|
|
94
|
+
return this.timestamper;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Установить идентификатор ключа по умолчанию
|
|
98
|
+
* @param keyId - ИНН для сертификатов или 'idcard'/'ckc' для USB-токенов
|
|
99
|
+
*/
|
|
100
|
+
setDefaultKeyId(keyId) {
|
|
101
|
+
this.defaultKeyId = keyId;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Получить идентификатор ключа по умолчанию
|
|
105
|
+
* @returns идентификатор ключа или undefined
|
|
106
|
+
*/
|
|
107
|
+
getDefaultKeyId() {
|
|
108
|
+
return this.defaultKeyId;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Очистить идентификатор ключа по умолчанию
|
|
112
|
+
*/
|
|
113
|
+
clearDefaultKeyId() {
|
|
114
|
+
this.defaultKeyId = undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Создаем единственный экземпляр (singleton)
|
|
118
|
+
const eimzoConfig = new EimzoConfigManager();
|
|
119
|
+
/**
|
|
120
|
+
* Инициализация API EIMZO с токенами
|
|
121
|
+
* @param domainAndKey - массив доменов и ключей [domain1, key1, domain2, key2, ...]
|
|
122
|
+
* @returns Promise с результатом инициализации
|
|
123
|
+
*/
|
|
124
|
+
export async function startApi(domainAndKey) {
|
|
125
|
+
return eimzoConfig.startApi(domainAndKey);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Получить статус инициализации
|
|
129
|
+
* @returns true если API успешно инициализирован
|
|
130
|
+
*/
|
|
131
|
+
export function getInitialized() {
|
|
132
|
+
return eimzoConfig.getInitialized();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Сбросить статус инициализации
|
|
136
|
+
*/
|
|
137
|
+
export function reset() {
|
|
138
|
+
eimzoConfig.reset();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Установить конфигурацию
|
|
142
|
+
* @param config - конфигурация EIMZO
|
|
143
|
+
*/
|
|
144
|
+
export function setConfig(config) {
|
|
145
|
+
eimzoConfig.setConfig(config);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Получить функцию timestamper из конфигурации
|
|
149
|
+
* @returns функция timestamper или undefined
|
|
150
|
+
*/
|
|
151
|
+
export function getTimestamper() {
|
|
152
|
+
return eimzoConfig.getTimestamper();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Установить идентификатор ключа по умолчанию
|
|
156
|
+
* @param keyId - ИНН для сертификатов или 'idcard'/'ckc' для USB-токенов
|
|
157
|
+
*/
|
|
158
|
+
export function setDefaultKeyId(keyId) {
|
|
159
|
+
eimzoConfig.setDefaultKeyId(keyId);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Получить идентификатор ключа по умолчанию
|
|
163
|
+
* @returns идентификатор ключа или undefined
|
|
164
|
+
*/
|
|
165
|
+
export function getDefaultKeyId() {
|
|
166
|
+
return eimzoConfig.getDefaultKeyId();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Очистить идентификатор ключа по умолчанию
|
|
170
|
+
*/
|
|
171
|
+
export function clearDefaultKeyId() {
|
|
172
|
+
eimzoConfig.clearDefaultKeyId();
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/eimzo.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Result, EimzoError } from './errors';
|
|
2
|
+
import { ICert } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Получить все сертификаты (объединяет certkey и pfx)
|
|
5
|
+
* @param uid - опциональный фильтр по ИНН/ПИНФЛ пользователя
|
|
6
|
+
* @returns Result с массивом сертификатов
|
|
7
|
+
*/
|
|
8
|
+
export declare function getAllCertificates(uid?: string): Promise<Result<ICert[], EimzoError>>;
|
|
9
|
+
/**
|
|
10
|
+
* Получить список USB-токенов (CKC устройств)
|
|
11
|
+
* @returns Result с массивом строк описаний устройств
|
|
12
|
+
*/
|
|
13
|
+
export declare function getEimzoUSBTokens(): Promise<Result<string[], EimzoError>>;
|
|
14
|
+
//# sourceMappingURL=eimzo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eimzo.d.ts","sourceRoot":"","sources":["../src/eimzo.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,KAAK,EAAgB,MAAM,SAAS,CAAC;AA6G9C;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC,CA2EtC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAkD/E"}
|