eimzo-sign-core 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.
@@ -0,0 +1,247 @@
1
+ /**
2
+ * E-IMZO xatolarining barqaror kontrakti.
3
+ *
4
+ * Chaqiruvchi kod HAR DOIM `error.code` bo'yicha shox tanlaydi — xabar matnini
5
+ * hech qachon parslamaydi (matn i18n bilan o'zgaradi).
6
+ */
7
+ type EimzoErrorCode =
8
+ /** E-IMZO dasturi ishga tushmagan yoki javob bermayapti. */
9
+ 'E_NOT_INSTALLED'
10
+ /** E-IMZO versiyasi talab qilinganidan past. */
11
+ | 'E_VERSION_LOW'
12
+ /** Domen uchun API kaliti rad etildi (noto'g'ri kalit yoki domen). */
13
+ | 'E_API_KEY_REJECTED'
14
+ /** Foydalanuvchida sertifikat/kalit topilmadi yoki ro'yxatni o'qib bo'lmadi. */
15
+ | 'E_NO_CERTS'
16
+ /** Kalit yuklanmadi — ko'pincha foydalanuvchi parol oynasini yopgan. */
17
+ | 'E_KEY_LOAD_CANCELLED'
18
+ /** Imzolangan sertifikatning seriya raqami tanlangandan farq qiladi. XAVFSIZLIK. */
19
+ | 'E_SERIAL_MISMATCH'
20
+ /** `create_pkcs7` muvaffaqiyatsiz tugadi. */
21
+ | 'E_SIGN_FAILED'
22
+ /** E-IMZO belgilangan vaqt ichida javob bermadi. */
23
+ | 'E_TIMEOUT'
24
+ /** Foydalanuvchi yoki idle-taymer amalni bekor qildi. */
25
+ | 'E_CANCELLED'
26
+ /** Lokal soket / transport xatosi. */
27
+ | 'E_TRANSPORT'
28
+ /** Kutubxona noto'g'ri sozlangan (masalan, apiKeys berilmagan). */
29
+ | 'E_MISCONFIGURED';
30
+ interface EimzoErrorOptions {
31
+ cause?: unknown;
32
+ }
33
+ declare class EimzoError extends Error {
34
+ readonly code: EimzoErrorCode;
35
+ /** Asl sabab (vendor xatosi, CAPIWS javobi va h.k.). ES2022 `Error.cause` bilan bir xil nom. */
36
+ readonly cause?: unknown;
37
+ constructor(code: EimzoErrorCode, message: string, options?: EimzoErrorOptions);
38
+ /** `EimzoError.is(e)` yoki `EimzoError.is(e, 'E_TIMEOUT')`. */
39
+ static is(error: unknown, code?: EimzoErrorCode): error is EimzoError;
40
+ /** Bekor qilingan (foydalanuvchi voz kechgan) — odatda jimgina o'tiladi. */
41
+ static isCancelled(error: unknown): boolean;
42
+ }
43
+ /** Noma'lum qiymatni EimzoError'ga keltiradi (allaqachon EimzoError bo'lsa — o'zini qaytaradi). */
44
+ declare function toEimzoError(error: unknown, fallbackCode: EimzoErrorCode, fallbackMessage: string): EimzoError;
45
+
46
+ /** Sertifikat turi. `idcard` — ID-karta (alohida oqim, `loadKey` chaqirilmaydi). */
47
+ type CertType = 'pfx' | 'ftjc' | 'idcard';
48
+ /**
49
+ * Normallashtirilgan sertifikat. `raw` — vendor xom obyekti, `loadKey` ga
50
+ * o'zgarishsiz uzatiladi (undan tashqarida foydalanmang).
51
+ */
52
+ interface Cert {
53
+ serialNumber: string;
54
+ /** CN — egasi (F.I.Sh yoki tashkilot rahbari). */
55
+ CN: string;
56
+ /** STIR / JSHSHIR. */
57
+ TIN: string;
58
+ UID: string;
59
+ /** Tashkilot nomi (jismoniy shaxs kalitida bo'sh). */
60
+ O: string;
61
+ T: string;
62
+ validFrom: Date;
63
+ validTo: Date;
64
+ type: CertType;
65
+ /** @internal vendor xom obyekti */
66
+ raw: unknown;
67
+ }
68
+ interface EimzoVersion {
69
+ major: number;
70
+ minor: number;
71
+ }
72
+ interface EimzoClientOptions {
73
+ /**
74
+ * Domen API kalitlari: `[[domen, kalit], ...]`.
75
+ * E-IMZO tomonidan har domen uchun beriladi.
76
+ *
77
+ * MUHIM: kutubxonada default YO'Q. Ilova (consumer) o'z kalitlarini
78
+ * shu yerda beradi; prod kalitlari kutubxona kodiga yozilmaydi.
79
+ */
80
+ apiKeys: ReadonlyArray<readonly [domain: string, key: string]>;
81
+ /** Har bir CAPIWS chaqiruvi uchun timeout, ms. Default: 30000. */
82
+ timeoutMs?: number;
83
+ /**
84
+ * Kalit yuklash (parol kiritish) uchun alohida, uzunroq timeout, ms.
85
+ * Default: 120000.
86
+ */
87
+ keyLoadTimeoutMs?: number;
88
+ /** Minimal talab qilinadigan E-IMZO versiyasi. Default: 3.37. */
89
+ minVersion?: EimzoVersion;
90
+ /**
91
+ * Audit hook. Kutubxona HECH QACHON `console` ga yozmaydi — barcha
92
+ * kuzatuv shu yerdan o'tadi. Ilova buni o'z jurnaliga / SIEM'ga yozadi.
93
+ * Hook'dagi istisno kutubxonani buzmaydi (yutiladi).
94
+ *
95
+ * DIQQAT: `AuditEvent` ataylab minimal — faqat `serial` va `docId`.
96
+ * CN / TIN / JSHSHIR / imzo bloblari uzatilmaydi.
97
+ */
98
+ onAudit?: (event: AuditEvent) => void;
99
+ }
100
+ /** Imzolanadigan bitta hujjat. */
101
+ interface SignDoc {
102
+ /** Ilova ichidagi barqaror identifikator (natijani hujjatga bog'lash uchun). */
103
+ id: string;
104
+ /** Imzolanadigan XOM kontent (matn / XML / base64). Base64 kodlashni kutubxona bajaradi. */
105
+ content: string;
106
+ }
107
+ /** Bitta hujjat bo'yicha imzo natijasi. */
108
+ interface SignResult {
109
+ id: string;
110
+ pkcs7_64: string;
111
+ signature_hex: string;
112
+ signer_serial_number: string;
113
+ }
114
+ /** Partiyadagi bitta element — muvaffaqiyat yoki xato. */
115
+ type BatchSignItem = ({
116
+ id: string;
117
+ ok: true;
118
+ } & Omit<SignResult, 'id'>) | {
119
+ id: string;
120
+ ok: false;
121
+ error: EimzoError;
122
+ };
123
+ interface BatchProgress {
124
+ /** Tugagan hujjatlar soni. */
125
+ done: number;
126
+ /** Jami hujjatlar. */
127
+ total: number;
128
+ /** Hozir imzolanayotgan hujjat id'si (tugagach — undefined). */
129
+ currentId?: string;
130
+ }
131
+ interface SignBatchOptions {
132
+ /** Tashqi bekor qilish signali (idle-taymer, modal yopilishi). */
133
+ signal?: AbortSignal;
134
+ /** Har bir hujjatdan oldin/keyin chaqiriladi. */
135
+ onProgress?: (progress: BatchProgress) => void;
136
+ }
137
+ /**
138
+ * Audit hodisalari. Ataylab minimal maydonlar — shaxsiy ma'lumot yo'q.
139
+ */
140
+ type AuditEvent = {
141
+ type: 'version_checked';
142
+ ts: string;
143
+ major: number;
144
+ minor: number;
145
+ } | {
146
+ type: 'certs_listed';
147
+ ts: string;
148
+ count: number;
149
+ } | {
150
+ type: 'key_loaded';
151
+ ts: string;
152
+ serial: string;
153
+ } | {
154
+ type: 'sign_started';
155
+ ts: string;
156
+ serial: string;
157
+ docId: string;
158
+ } | {
159
+ type: 'sign_ok';
160
+ ts: string;
161
+ serial: string;
162
+ docId: string;
163
+ } | {
164
+ type: 'sign_failed';
165
+ ts: string;
166
+ docId: string;
167
+ code: EimzoErrorCode;
168
+ } | {
169
+ type: 'session_ended';
170
+ ts: string;
171
+ serial: string;
172
+ signed: number;
173
+ failed: number;
174
+ };
175
+
176
+ /**
177
+ * E-IMZO bilan ishlashning framework-agnostik yadrosi.
178
+ *
179
+ * Kafolatlar:
180
+ * - har chaqiruvda timeout bor (osilib qolmaydi);
181
+ * - `signBatch` kalitni BIR MARTA yuklaydi (parol bir marta so'raladi);
182
+ * - har imzodan keyin seriya raqami tanlangan sertifikatga tekshiriladi;
183
+ * - sessiya tugagach yuklangan kalit holati JS'da saqlanmaydi;
184
+ * - `console` ga hech narsa yozilmaydi — hammasi `onAudit` orqali.
185
+ */
186
+ declare class EimzoClient {
187
+ private readonly apiKeys;
188
+ private readonly timeoutMs;
189
+ private readonly keyLoadTimeoutMs;
190
+ private readonly minVersion;
191
+ private readonly onAudit?;
192
+ /** Faqat joriy sessiya davomida to'ldiriladi; `signBatch` oxirida tozalanadi. */
193
+ private activeKeySerial;
194
+ constructor(options: EimzoClientOptions);
195
+ /**
196
+ * Versiyani tekshiradi va domen API kalitlarini o'rnatadi.
197
+ * Har imzolash seansidan oldin (yoki ilova yuklanganda bir marta) chaqiring.
198
+ */
199
+ install(): Promise<EimzoVersion>;
200
+ checkVersion(): Promise<EimzoVersion>;
201
+ private installApiKeys;
202
+ /** Foydalanuvchining barcha kalitlari (disk + token). ID-karta bunga kirmaydi. */
203
+ listCerts(): Promise<Cert[]>;
204
+ /** ID-karta o'quvchiga ulanganmi. Timeout'da `false` qaytaradi (xato tashlamaydi). */
205
+ isIdCardPlugged(): Promise<boolean>;
206
+ /** ID-karta uchun "sertifikat" o'rnini bosuvchi belgili obyekt. */
207
+ static idCardCert(): Cert;
208
+ /**
209
+ * Bitta sertifikat bilan bir nechta hujjatni imzolaydi.
210
+ *
211
+ * Oqim:
212
+ * 1. Kalitni bir marta yuklaydi (`idcard` bo'lsa — yuklamaydi).
213
+ * 2. Har hujjat uchun `create_pkcs7` ni KETMA-KET chaqiradi (parallel EMAS —
214
+ * CAPIWS bitta soket).
215
+ * 3. Har natijada `signer_serial_number` ni tekshiradi.
216
+ * 4. Yakunda kalit holatini tozalaydi.
217
+ *
218
+ * Bitta hujjat xato bersa — massivda `ok:false` bilan qoladi, qolganlari davom etadi.
219
+ * Foydalanuvchi bekor qilsa (`signal`) — `E_CANCELLED` tashlanadi.
220
+ */
221
+ signBatch(cert: Cert, docs: readonly SignDoc[], options?: SignBatchOptions): Promise<BatchSignItem[]>;
222
+ /** Yagona hujjatni imzolash — `signBatch` ustidagi qulaylik. */
223
+ sign(cert: Cert, content: string, options?: SignBatchOptions): Promise<BatchSignItem>;
224
+ private acquireKey;
225
+ private loadKey;
226
+ private createPkcs7;
227
+ private audit;
228
+ }
229
+
230
+ /** Sertifikat berilgan sanada muddati o'tganmi. */
231
+ declare function certIsExpired(cert: Cert, at?: Date): boolean;
232
+ /** Sertifikat hali kuchга kirmaganmi (validFrom kelajakda). */
233
+ declare function certIsNotYetValid(cert: Cert, at?: Date): boolean;
234
+ /** Sertifikat hozir amal qiladimi (from <= now <= to). */
235
+ declare function certIsUsable(cert: Cert, at?: Date): boolean;
236
+ /** Muddati yaqin kunlarda tugaydimi (default 14 kun). */
237
+ declare function certExpiresSoon(cert: Cert, withinDays?: number, at?: Date): boolean;
238
+ /**
239
+ * Ro'yxatni ko'rsatish tartibiga keltiradi: amaldagilar tepada,
240
+ * keyin muddat tugash sanasi bo'yicha kamayish tartibida.
241
+ * Yangi massiv qaytaradi (mutatsiya yo'q).
242
+ */
243
+ declare function sortCerts(certs: readonly Cert[], at?: Date): Cert[];
244
+ /** Bir xil seriya raqamli takroriy sertifikatlarni olib tashlaydi (disk + token). */
245
+ declare function dedupeCerts(certs: readonly Cert[]): Cert[];
246
+
247
+ export { type AuditEvent, type BatchProgress, type BatchSignItem, type Cert, type CertType, EimzoClient, type EimzoClientOptions, EimzoError, type EimzoErrorCode, type EimzoErrorOptions, type EimzoVersion, type SignBatchOptions, type SignDoc, type SignResult, certExpiresSoon, certIsExpired, certIsNotYetValid, certIsUsable, dedupeCerts, sortCerts, toEimzoError };