@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.
Files changed (62) hide show
  1. package/README.md +448 -0
  2. package/dist/config.d.ts +42 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +174 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/eimzo.d.ts +14 -0
  7. package/dist/eimzo.d.ts.map +1 -0
  8. package/dist/eimzo.js +142 -0
  9. package/dist/eimzo.js.map +1 -0
  10. package/dist/errors.d.ts +45 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +45 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +10 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/messages.d.ts +19 -0
  19. package/dist/messages.d.ts.map +1 -0
  20. package/dist/messages.js +19 -0
  21. package/dist/messages.js.map +1 -0
  22. package/dist/sign/attach.d.ts +11 -0
  23. package/dist/sign/attach.d.ts.map +1 -0
  24. package/dist/sign/attach.js +46 -0
  25. package/dist/sign/attach.js.map +1 -0
  26. package/dist/sign/getAcceptSignature.d.ts +15 -0
  27. package/dist/sign/getAcceptSignature.d.ts.map +1 -0
  28. package/dist/sign/getAcceptSignature.js +90 -0
  29. package/dist/sign/getAcceptSignature.js.map +1 -0
  30. package/dist/sign/getSignature.d.ts +12 -0
  31. package/dist/sign/getSignature.d.ts.map +1 -0
  32. package/dist/sign/getSignature.js +66 -0
  33. package/dist/sign/getSignature.js.map +1 -0
  34. package/dist/sign/index.d.ts +8 -0
  35. package/dist/sign/index.d.ts.map +1 -0
  36. package/dist/sign/index.js +8 -0
  37. package/dist/sign/index.js.map +1 -0
  38. package/dist/sign/keyLoaders.d.ts +21 -0
  39. package/dist/sign/keyLoaders.d.ts.map +1 -0
  40. package/dist/sign/keyLoaders.js +87 -0
  41. package/dist/sign/keyLoaders.js.map +1 -0
  42. package/dist/sign/pkcs7.d.ts +33 -0
  43. package/dist/sign/pkcs7.d.ts.map +1 -0
  44. package/dist/sign/pkcs7.js +182 -0
  45. package/dist/sign/pkcs7.js.map +1 -0
  46. package/dist/sign/sign.d.ts +11 -0
  47. package/dist/sign/sign.d.ts.map +1 -0
  48. package/dist/sign/sign.js +42 -0
  49. package/dist/sign/sign.js.map +1 -0
  50. package/dist/sign/types.d.ts +48 -0
  51. package/dist/sign/types.d.ts.map +1 -0
  52. package/dist/sign/types.js +3 -0
  53. package/dist/sign/types.js.map +1 -0
  54. package/dist/types.d.ts +43 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +3 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/utils/parseData.d.ts +13 -0
  59. package/dist/utils/parseData.d.ts.map +1 -0
  60. package/dist/utils/parseData.js +96 -0
  61. package/dist/utils/parseData.js.map +1 -0
  62. 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
+
@@ -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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"}
@@ -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"}