@gerege-systems/eid-mongolia-sdk 0.14.2 → 0.15.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 +176 -54
- package/dist/{browser-CSZjH9Xs.d.cts → browser-8k_VDSP8.d.cts} +8 -183
- package/dist/{browser-CSZjH9Xs.d.ts → browser-BZ3hvv6-.d.ts} +8 -183
- package/dist/browser.d.cts +2 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.js +5 -3
- package/dist/button.cjs +55 -45
- package/dist/button.js +55 -45
- package/dist/chunk-REWNE7PO.js +51 -0
- package/dist/{chunk-DXVHOZO7.js → chunk-TB2KQH3W.js} +1 -46
- package/dist/errors-Z7SgLVTr.d.cts +149 -0
- package/dist/errors-Z7SgLVTr.d.ts +149 -0
- package/dist/index.cjs +270 -256
- package/dist/index.d.cts +169 -159
- package/dist/index.d.ts +169 -159
- package/dist/index.js +256 -241
- package/dist/pades.cjs +3520 -0
- package/dist/pades.d.cts +128 -0
- package/dist/pades.d.ts +128 -0
- package/dist/pades.js +3484 -0
- package/package.json +16 -6
package/README.md
CHANGED
|
@@ -7,7 +7,8 @@ RP-API v3, Smart-ID нийцтэй. Бүрэн баримт: <https://developer.
|
|
|
7
7
|
> ⚠️ SDK **backend**-д ажиллана: бүх дуудлага API secret (`rp_sk_…`)-ээр баталгаажна, secret-ийг браузер/гар утсанд
|
|
8
8
|
> хэзээ ч задлахгүй. Браузерт зөвхөн таны backend-ийн өгсөн холбоос/QR/товч харагдана — «eID-ээр нэвтрэх» товч
|
|
9
9
|
> (`/button`) ч таны backend-ийг л дуудна (§1a). `@gerege-systems/eid-mongolia-sdk/browser`-ийн legacy device-link
|
|
10
|
-
> туслахууд 2026-10-07-оос ажиллахгүй (§4).
|
|
10
|
+
> туслахууд 2026-10-07-оос ажиллахгүй (§4). Үл хамаарах: `@gerege-systems/eid-mongolia-sdk/pades` (клиент талын PDF
|
|
11
|
+
> гарын үсэг, secret-гүй) хөтөч болон Node-д ажиллана (§3d).
|
|
11
12
|
|
|
12
13
|
## Суулгах
|
|
13
14
|
|
|
@@ -15,7 +16,8 @@ RP-API v3, Smart-ID нийцтэй. Бүрэн баримт: <https://developer.
|
|
|
15
16
|
npm install @gerege-systems/eid-mongolia-sdk
|
|
16
17
|
```
|
|
17
18
|
|
|
18
|
-
Node.js ≥
|
|
19
|
+
Node.js ≥ 18 (global `fetch`, `node:crypto`) — бүх entry (`.`, `/browser`, `/button`, `/pades`), CI-д Node 18 / 20 / 22-оор шалгагдана.
|
|
20
|
+
`/pades` мөн орчин үеийн хөтөчид (Web Crypto) ажиллана.
|
|
19
21
|
|
|
20
22
|
## 1. RP бүртгүүлэх
|
|
21
23
|
|
|
@@ -70,7 +72,7 @@ export const eidLogin = createEidLogin({
|
|
|
70
72
|
};
|
|
71
73
|
},
|
|
72
74
|
// store: redisStore, // олон instance / serverless бол (анхдагч — процессын санах ой)
|
|
73
|
-
// rateLimit: (key) => redisLimiter.allow(key), //
|
|
75
|
+
// rateLimit: { start: (key) => redisLimiter.allow(key) }, // анхдагчтай нэгтгэгдэнэ (push 3/мин хэвээр) — доор «Хязгаарлалт»
|
|
74
76
|
trustProxy: 1, // handle(Request)-д клиент IP: nginx/LB нэг hop бол 1 (доор «Клиент IP»)
|
|
75
77
|
});
|
|
76
78
|
```
|
|
@@ -93,8 +95,27 @@ export const POST = (req: Request) => eidLogin.handle(req);
|
|
|
93
95
|
Vercel `req.headers.get("x-real-ip")`). `trustProxy`-оос давуу.
|
|
94
96
|
|
|
95
97
|
Аль нь ч үгүй бол IP-ээр хязгаарлахгүй (эхний хүсэлтэд `onError`-оор нэг удаа анхааруулна). `handleRequest`-д `req.ip`
|
|
96
|
-
(Express `req.ip`, `app.set("trust proxy", …)`-тэй) шууд хэрэглэгдэнэ.
|
|
97
|
-
|
|
98
|
+
(Express `req.ip`, `app.set("trust proxy", …)`-тэй) шууд хэрэглэгдэнэ. Go: `eidlogin.Config.ClientIP` (`eidlogin.ForwardedClientIP(n)`) — ижил дүрэм.
|
|
99
|
+
|
|
100
|
+
**Хязгаарлалт** (`rateLimit`). Түлхүүр: `start:<ip>` (IP мэдэгдэж байвал), `push:<idCode>`; татгалзвал 429 + `Retry-After: 60`.
|
|
101
|
+
Анхдагч `defaultRateLimit` = `{ push: { limit: 3, windowMs: 60_000 } }` — нэг дугаарт минутад 3 мэдэгдэл (MFA fatigue);
|
|
102
|
+
`start`-ийг анхдагчаар хязгаарладаггүй.
|
|
103
|
+
|
|
104
|
+
- **Объект** `{ start?, push? }` — анхдагчтай **нэгтгэгдэнэ**: өгсөн төрөл анхдагчийг дарна, өгөөгүй нь анхдагчаараа үлдэнэ.
|
|
105
|
+
Утга: `{ limit, windowMs }` (процессын санах ойн гулсах цонх), `(key) => boolean | Promise<boolean>` (Redis г.м.),
|
|
106
|
+
эсвэл `false` (тухайн төрлийг хязгаарлахгүй). Өөр түлхүүр → `createEidLogin` throw.
|
|
107
|
+
- **Функц** `(key) => …` — бүх түлхүүрт дуудагдана, анхдагч хязгаар **дээр нэмэгдэнэ** (хоёулаа зөвшөөрөх ёстой).
|
|
108
|
+
Анхдагчийг сулруулах/солих бол объектоор тухайн төрлийг өг (`{ push: … }`).
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
import { defaultRateLimit } from "@gerege-systems/eid-mongolia-sdk";
|
|
112
|
+
rateLimit: { start: { limit: 20, windowMs: 60_000 } }, // push 3/мин хэвээр
|
|
113
|
+
rateLimit: { ...defaultRateLimit, start: (k) => redis.allow(k) }, // ижил — анхдагчийг илэрхий бичсэн
|
|
114
|
+
rateLimit: { push: (k) => redis.allow(k, 3, 60) }, // олон instance: push-ийг Redis-ээр солино
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Go: `eidlogin.Config.RateLimits` (`map[string]eidlogin.RateRule{"start": {Max: 20, Window: time.Minute}}`,
|
|
118
|
+
`eidlogin.DefaultRateLimit()`) — ижил нэгтгэл; `Config.RateLimit` функц мөн анхдагч дээр нэмэгдэнэ.
|
|
98
119
|
|
|
99
120
|
Express:
|
|
100
121
|
|
|
@@ -126,21 +147,39 @@ app.use("/auth/eid", express.json(), async (req, res) => {
|
|
|
126
147
|
**Дизайн, theme.** Дизайн нь eID нэвтрэх хуудсынх (лого, өнгө). Фонт нь хуудаснаас өвлөгдөнө (товч, цонх, input бүгд).
|
|
127
148
|
`theme="auto"` үед дараалал: хуудасны `html[data-theme="dark|light"]` → `html.dark` / `html.light` → OS
|
|
128
149
|
(`prefers-color-scheme`); хуудас theme солиход (MutationObserver) шууд дагана. `theme="light|dark"` нь хуудсыг давна.
|
|
129
|
-
Өнгө, радиусыг CSS хувьсагчаар
|
|
150
|
+
Өнгө, радиусыг CSS хувьсагчаар дарна. `--eid-*` нь зөвхөн **оролт** (shadow дотор тодорхойлогддоггүй) тул хуудасны
|
|
151
|
+
аль ч түвшинд (`:root`, эцэг элемент, `eid-login-button`) өгсөн утга өвлөгдөж **light ба dark хоёуланд** үйлчилнэ;
|
|
152
|
+
`--eid-<нэр>-dark` нь зөвхөн dark-д, `--eid-<нэр>`-ээс давуу. Аль нь ч үгүй бол eID-ийн анхдагч (доорх хүснэгт) — fallback л.
|
|
153
|
+
Dark-ийн дараалал: `--eid-<нэр>-dark` → `--eid-<нэр>` → dark анхдагч.
|
|
130
154
|
|
|
131
155
|
```css
|
|
132
|
-
eid-login-button {
|
|
133
|
-
--eid-accent:
|
|
134
|
-
--eid-
|
|
135
|
-
--eid-fg: …; --eid-fg-muted: …; --eid-fg-subtle: …; /* текст */
|
|
136
|
-
--eid-border: …; --eid-border-strong: …; --eid-ring: …; /* хүрээ, focus */
|
|
137
|
-
--eid-warning-bg: …; --eid-warning-border: …; --eid-warning-fg: …; --eid-danger-fg: …;
|
|
156
|
+
:root { /* эсвэл eid-login-button { … } */
|
|
157
|
+
--eid-accent: var(--brand); /* хоёр theme-д */
|
|
158
|
+
--eid-accent-dark: var(--brand-400); /* зөвхөн dark-д (өгөхгүй бол --eid-accent) */
|
|
138
159
|
--eid-radius: 6px; --eid-radius-lg: 8px;
|
|
139
160
|
}
|
|
140
|
-
|
|
141
|
-
eid-login-button::part(button) { width: 100%; } /* part: button, backdrop, dialog */
|
|
161
|
+
eid-login-button::part(button) { width: 100%; } /* part: button, backdrop, dialog */
|
|
142
162
|
```
|
|
143
163
|
|
|
164
|
+
| Хувьсагч (`-dark` хувилбартай) | Юунд | Light анхдагч | Dark анхдагч |
|
|
165
|
+
|---|---|---|---|
|
|
166
|
+
| `--eid-accent` | үндсэн товч | `oklch(0.534 0.2 259)` | `oklch(0.64 0.15 259)` |
|
|
167
|
+
| `--eid-accent-fg` | үндсэн товчны текст | `#fff` | `hsl(229 50% 6%)` |
|
|
168
|
+
| `--eid-accent-subtle` | алхмын дугаарын дэвсгэр | `oklch(0.97 0.03 259)` | `oklch(0.24 0.06 259)` |
|
|
169
|
+
| `--eid-accent-subtle-fg` | алхмын дугаар | `oklch(0.474 0.19 259)` | `oklch(0.82 0.1 259)` |
|
|
170
|
+
| `--eid-ring` | focus | `oklch(0.604 0.2 259)` | `oklch(0.68 0.15 259)` |
|
|
171
|
+
| `--eid-bg` | цонх, outline товч, input | `hsl(0 0% 100%)` | `hsl(229 50% 6%)` |
|
|
172
|
+
| `--eid-bg-subtle` | — (нөөц) | `hsl(210 40% 98%)` | `hsl(222 47% 9%)` |
|
|
173
|
+
| `--eid-bg-muted` | hover | `hsl(210 40% 96%)` | `hsl(217 33% 13%)` |
|
|
174
|
+
| `--eid-fg` | текст | `hsl(222 47% 11%)` | `hsl(210 40% 98%)` |
|
|
175
|
+
| `--eid-fg-muted` | хоёрдогч текст | `hsl(215 19% 35%)` | `hsl(213 27% 84%)` |
|
|
176
|
+
| `--eid-fg-subtle` | тайлбар, placeholder | `hsl(215 16% 45%)` | `hsl(215 20% 65%)` |
|
|
177
|
+
| `--eid-border` | цонх, QR, тусгаарлагч | `hsl(214 32% 91%)` | `hsl(217 33% 17%)` |
|
|
178
|
+
| `--eid-border-strong` | outline товч, input | `hsl(213 27% 84%)` | `hsl(215 25% 27%)` |
|
|
179
|
+
| `--eid-warning-bg` / `-border` / `-fg` | сүлжээний анхааруулга | `hsl(48 100% 96%)` / `hsl(45 95% 78%)` / `hsl(23 75% 33%)` | `hsl(20 60% 10%)` / `hsl(22 70% 26%)` / `hsl(40 92% 65%)` |
|
|
180
|
+
| `--eid-danger-fg` | алдаа | `hsl(0 74% 42%)` | `hsl(0 91% 71%)` |
|
|
181
|
+
| `--eid-radius` / `--eid-radius-lg` (theme-гүй) | булан | `6px` / `8px` | — |
|
|
182
|
+
|
|
144
183
|
**eID аппын доод хувилбар.** `flowType` бэхлэлт (device link v3) ба Web2App-ийн `userChallengeVerifier` нь
|
|
145
184
|
**iOS 2.2.3 (build 59)**, **Android 2.2.3 (versionCode 60)**-аас эхэлсэн. eID сервер 2026-10-07-оос legacy холбоосыг
|
|
146
185
|
бүрэн хассан (v3-гүй session-д утас `DEVICE_LINK_REQUIRED`) бөгөөд доод хувилбарыг `/mobile/app-config`-оор албадан
|
|
@@ -235,7 +274,7 @@ UTF8String/PrintableString/BMPString. `parseSubject` нь зөвхөн задл
|
|
|
235
274
|
> жагсаалтаар ирдэг; Smart-ID ба eID-д Notification төрлийн device link **байхгүй** (CA `docs/DEVICE_LINK_V3.md` §3).
|
|
236
275
|
> Хуучин `/dl?sessionId&vc` холбоос (`deviceLink`) push session-д ч юу ч өгөхгүй (сервер `DEVICE_LINK_REQUIRED`).
|
|
237
276
|
> Иргэн RP-ийг eID апптай ижил утсан дээр нээсэн бол push-ийн оронд **device-link Web2App** урсгал хэрэглэ
|
|
238
|
-
> (`auth.deviceLink*` / `
|
|
277
|
+
> (`auth.deviceLink*` / `signPdfDigest({ flow: "device-link" })` + `buildDeviceLink(…, "Web2App")`, §4) — товч аппыг шууд
|
|
239
278
|
> нээж, callback-аар буцна. Push-д «eID аппаа нээнэ үү» гэсэн текст л хангалттай.
|
|
240
279
|
|
|
241
280
|
## 3. Гарын үсэг (qualified signature)
|
|
@@ -324,42 +363,22 @@ const { representations } = await eid.organization.getRepresentations("PNOMN-123
|
|
|
324
363
|
// → [{ orgEtsi: "NTRMN-6235972", orgName: "Гэрэгэ Системс ХХК", role: "ceo", roleLabel: "Гүйцэтгэх захирал",
|
|
325
364
|
// rightType: "ADMIN", rightTypeLabel: "Админ", source: "REGISTRY", sourceLabel: "Улсын бүртгэл", … }]
|
|
326
365
|
|
|
327
|
-
// 2. PDF (
|
|
366
|
+
// 2. PDF: §3d (клиент талын PAdES) — signPdfDigest({ …, onBehalfOf }) + prepare({ claimedRole: rep.claimedRole }).
|
|
367
|
+
// 3. Raw digest гарын үсэг: eid.sign.digestByEtsi(id, digest, interactions, { onBehalfOf: "NTRMN-6235972" })
|
|
368
|
+
// — CMS-ийг та угсардаг тул мэдүүлсэн үүргийг (signer-attributes-v2) өөрөө нэмнэ.
|
|
328
369
|
try {
|
|
329
|
-
|
|
330
|
-
pdf: pdfBytes, fileName: "Гэрээ №12.pdf",
|
|
331
|
-
signer: { etsi: "PNOMN-12345678" }, flow: "notification",
|
|
332
|
-
onBehalfOf: "NTRMN-6235972",
|
|
333
|
-
});
|
|
334
|
-
showToUser(s.vc);
|
|
335
|
-
const r = await eid.session.waitForResult(s.sessionId);
|
|
336
|
-
// MUST: endResult OK, pdf.documentStatus READY, pdf.signer.onBehalfOf = хүссэн байгууллага,
|
|
337
|
-
// татсан файлын SHA-256 = pdf.outSha256, validation.indication "valid", ltv true.
|
|
338
|
-
if (r.pdf?.documentStatus !== "READY" || r.pdf.signer?.onBehalfOf !== "NTRMN-6235972") throw new Error("…");
|
|
339
|
-
const signed = await eid.pdf.documentVerified(s.sessionId, r.pdf); // SHA-256 ≠ pdf.outSha256 → ValidationError
|
|
340
|
-
console.log(r.pdf.signer.claimedRole); // "Гүйцэтгэх захирал, Гэрэгэ Системс ХХК (NTRMN-6235972)"
|
|
370
|
+
/* … */
|
|
341
371
|
} catch (e) {
|
|
342
372
|
if ((e instanceof ForbiddenError || e instanceof ApiError) && e.code) {
|
|
343
373
|
// REPRESENTATION_DENIED | REPRESENTATION_PENDING | REPRESENTATION_EXPIRED | ORG_NOT_ACTIVE |
|
|
344
|
-
// SIGNER_UNIDENTIFIED (403) · ORG_NOT_FOUND (404) · REPRESENTATION_REVOKED (403,
|
|
374
|
+
// SIGNER_UNIDENTIFIED (403) · ORG_NOT_FOUND (404) · REPRESENTATION_REVOKED (403, бүртгэлийн үед)
|
|
345
375
|
}
|
|
346
376
|
throw e;
|
|
347
377
|
}
|
|
348
|
-
|
|
349
|
-
// Raw digest гарын үсэгт ч мөн: eid.sign.digestByEtsi(id, digest, interactions, { onBehalfOf: "NTRMN-6235972" })
|
|
350
|
-
// — CMS/PDF-ийг та угсардаг тул мэдүүлсэн үүргийг (signer-attributes-v2) өөрөө нэмнэ.
|
|
351
378
|
```
|
|
352
379
|
|
|
353
|
-
|
|
354
|
-
`
|
|
355
|
-
(харуулсан урсгалаа). Гарын үсэгтэй PDF-ийг
|
|
356
|
-
`pdf.document()`-ийн оронд `pdf.documentVerified(sessionId, r.pdf)`-аар тат — `READY` + `outSha256` тулгалтыг хийнэ.
|
|
357
|
-
|
|
358
|
-
Түр алдаа — `ApiError.retryable` үнэн, `retryAfterMs`-ийн (CA-ийн `Retry-After`, секунд эсвэл огноо) дараа давтана:
|
|
359
|
-
prepare 429 `PDF_PREPARE_BUSY`, 503 `LTV_UNAVAILABLE` / `TSA_UNAVAILABLE`; document 503 `DOCUMENT_PENDING`,
|
|
360
|
-
`TSA_UNAVAILABLE`, `LTV_UNAVAILABLE` (`RETRYABLE_ERROR_CODES`). `headers` — хариуны header. PDF дуудлагын хугацаа
|
|
361
|
-
`pdfTimeoutMs` (анхдагч 80000). `pdf.document` санах ойд `pdfMaxBytes` (анхдагч `DEFAULT_PDF_MAX_BYTES` = 64 MiB)
|
|
362
|
-
хүртэл уншина; хэтэрвэл `ResponseTooLargeError`. JSON хариу 4 MiB-ээс хэтэрвэл мөн `ResponseTooLargeError` (таслахгүй).
|
|
380
|
+
Түр алдаа — `ApiError.retryable` үнэн, `retryAfterMs`-ийн (CA-ийн `Retry-After`, секунд эсвэл огноо) дараа давтана
|
|
381
|
+
(`RETRYABLE_ERROR_CODES`). `headers` — хариуны header. JSON хариу 4 MiB-ээс хэтэрвэл `ResponseTooLargeError` (таслахгүй).
|
|
363
382
|
`getRepresentations`-ийн `raw` — серверийн түүхий JSON.
|
|
364
383
|
|
|
365
384
|
**Хүнд харуулахдаа `roleLabel` / `rightTypeLabel` / `sourceLabel` ашигла** (representations болон session-ий
|
|
@@ -368,9 +387,7 @@ prepare 429 `PDF_PREPARE_BUSY`, 503 `LTV_UNAVAILABLE` / `TSA_UNAVAILABLE`; docum
|
|
|
368
387
|
машин утга, өөрөө орчуулахгүй. Хэл: `new EidClient({ …, language: "en" })` → дуудлага бүрд `Accept-Language`; анхдагч
|
|
369
388
|
илгээхгүй (сервер mn). Хуучин CA-д эдгээр талбар байхгүй.
|
|
370
389
|
|
|
371
|
-
|
|
372
|
-
Session-ий `onBehalfOf` блок (`role`/`roleLabel`/`rightType`/`rightTypeLabel`) нь хариу угсрах үеийн бүртгэл; `pdf.signer.onBehalfOf`/`claimedRole`
|
|
373
|
-
нь баримтад бичигдсэн утга.
|
|
390
|
+
Session-ий `onBehalfOf` блок (`role`/`roleLabel`/`rightType`/`rightTypeLabel`) нь хариу угсрах үеийн бүртгэл.
|
|
374
391
|
|
|
375
392
|
## 3b. Иргэний PKI самбар (`PKI_READ` эрх)
|
|
376
393
|
|
|
@@ -394,14 +411,111 @@ const ch = await eid.token.authChallenge();
|
|
|
394
411
|
const digest = tokenAuthDigest(ch.rpUUID, ch.challenge); // токен CKM_ECDSA → түүхий r||s
|
|
395
412
|
const who = await eid.token.authVerify(ch.challengeId, authCertDer, rs);
|
|
396
413
|
|
|
397
|
-
// токеноор PDF (
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
414
|
+
// токеноор PDF: §3d — prepare() → токен CKM_ECDSA(dtbs) → r||s → complete() → registerSignature() (sessionID-гүй, medium "token")
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
`/token/auth/*` нь CA-д байгаа ч `/.well-known/eid`-д хараахан жагсаагдаагүй (гэрээний тест WARN).
|
|
418
|
+
|
|
419
|
+
## 3d. PDF гарын үсэг (PAdES, клиент тал) — `@gerege-systems/eid-mongolia-sdk/pades`
|
|
420
|
+
|
|
421
|
+
**PDF eID-ийн сервер рүү ОЧИХГҮЙ** (Smart-ID / DigiDoc загвар). Баримтыг таны тал (браузер эсвэл Node) НАТИВ
|
|
422
|
+
TypeScript-ээр (WASM-гүй, Web Crypto) угсарна; CA зөвхөн 32 байт DTBS-д гарын үсгийн session (ердийн
|
|
423
|
+
`RAW_DIGEST_SIGNATURE`) ба CMS-ийн бүртгэлийг хийнэ. Гаралт: PAdES-BASELINE-LT (цагийн тэмдэг tsa.timeserver.mn, OCSP/CRL
|
|
424
|
+
DSS-д), Adobe / EU DSS-д «LTV enabled», баталгаажуулах (QR) хуудастай (mn анхдагч / en). Go reference
|
|
425
|
+
(`eid-mongolia-sdk-go/pades`, профайл `pades-client/1`)-тэй **байт-ижил** — conformance golden-оор CI-д шалгагдана.
|
|
426
|
+
|
|
427
|
+
| Функц | Хаана | Тайлбар |
|
|
428
|
+
|---|---|---|
|
|
429
|
+
| `prepare(pdf, { signerCert, claimedRole?, verifyPage?, fileName?, lang?, docId?, … })` | браузер / Node | `{ dtbs, digest, docId, state }` — сүлжээгүй |
|
|
430
|
+
| `eid.signPdfDigest({ dtbs, fileName, signer, flow?, onBehalfOf? })` | RP backend | DTBS-д гарын үсгийн session (push эсвэл device-link) |
|
|
431
|
+
| `complete(state, signature)` | браузер / Node | TSA + OCSP/CRL → `{ pdf, cms, docId, outSha256, inSha256, hasPage, pageSha256, … }` |
|
|
432
|
+
| `eid.registerSignature(registrationFromCompleted(done, { fileName, sessionID }))` | RP backend | `POST /pdf/signatures` — `/verify/{docID}` бүртгэл |
|
|
433
|
+
|
|
434
|
+
`/pades` хөтчийн bundle ~125 KB gzip (Noto Sans фонт asset-тэй, CI-д ≤ 300 KB); үндсэн entry үүнийг агуулахгүй. `/pades` (ба бүх багц) **Node ≥ 18** (CI: 18 / 20 / 22),
|
|
435
|
+
орчин үеийн хөтөч. Браузерийн CSP: `connect-src https://tsa.timeserver.mn https://ocsp.eidmongolia.mn
|
|
436
|
+
https://crl.eidmongolia.mn`. Хөтөчид гэрчилгээний `http://` AIA/CDP-г зөвхөн эдгээр хостод `https://` болгоно; үндэсний
|
|
437
|
+
CA-ийн CRL (`esign.gov.mn`) нь `crl.eidmongolia.mn` толин хуулбараас (бүх платформд). Шалгагч (`verify`) энд
|
|
438
|
+
**байхгүй** — бүрэн криптограф шалгалт Go backend SDK-д; `prepare` нь өмнөх гарын үсгийг «хөнгөн» шалгуураар (бүтэц,
|
|
439
|
+
CMS гарын үсэг, eID олгогч, timestamp, DSS) л шалгана.
|
|
440
|
+
|
|
441
|
+
**Зурагчийн гэрчилгээ.** `prepare` иргэний SIGN гэрчилгээг (`signingCertificateV2`) шаарддаг тул session-оос ӨМНӨ
|
|
442
|
+
хэрэгтэй — одоогоор `eid.person.certificates(etsi)` (`PKI_READ`; `type: "SIGN"`, `status: "VALID"`, `keyMedium: "MOBILE"`
|
|
443
|
+
мөрийн `certValue` + `documentNumber`). Session-ийг тэр `documentNumber`-ээр эхлүүлнэ — өөр төхөөрөмж зурвал `complete`
|
|
444
|
+
`SIGNATURE_INVALID`.
|
|
445
|
+
|
|
446
|
+
### Вэб RP (браузер prepare/complete, backend session)
|
|
447
|
+
|
|
448
|
+
```ts
|
|
449
|
+
// ── браузер ─────────────────────────────────────────────────────────────────────────────
|
|
450
|
+
import { prepare, complete } from "@gerege-systems/eid-mongolia-sdk/pades";
|
|
451
|
+
|
|
452
|
+
const { signerCert, documentNumber } = await api("/sign/pdf/signer"); // backend: person.certificates
|
|
453
|
+
const p = await prepare(pdfBytes, {
|
|
454
|
+
signerCert, verifyPage: true, fileName: "Гэрээ №12.pdf",
|
|
455
|
+
claimedRole, // байгууллагаар бол getRepresentations()-ийн claimedRole ЯГ ХЭВЭЭР
|
|
456
|
+
});
|
|
457
|
+
await idb.put("pades-state", p.state); // хуудас дахин ачаалагдаж болно
|
|
458
|
+
const s = await api("/sign/pdf/start", { dtbs: b64(p.dtbs), documentNumber, fileName: "Гэрээ №12.pdf" });
|
|
459
|
+
showToUser(s.vc); // эсвэл backend-ийн QR (§4)
|
|
460
|
+
const { signature } = await api(`/sign/pdf/${s.sessionId}/result`); // backend poll + validateSign
|
|
461
|
+
const done = await complete(p.state, signature); // TSA + OCSP/CRL + DSS
|
|
462
|
+
const { pdf, signerCert: _c, ...meta } = done; // PDF backend рүү очихгүй
|
|
463
|
+
await api(`/sign/pdf/${s.sessionId}/register`, { ...meta, cms: b64(done.cms) });
|
|
464
|
+
download(done.pdf, "Гэрээ №12.pdf");
|
|
465
|
+
|
|
466
|
+
// ── RP backend (Node) ─────────────────────────────────────────────────────────────────────
|
|
467
|
+
// /sign/pdf/start — sessionSecret (device-link) backend-ээс гарахгүй; s.digest-ийг session-д хадгал.
|
|
468
|
+
const s = await eid.signPdfDigest({
|
|
469
|
+
dtbs: req.body.dtbs, fileName: req.body.fileName,
|
|
470
|
+
signer: { documentNumber: req.body.documentNumber }, // эсвэл { etsi }
|
|
471
|
+
onBehalfOf: "NTRMN-6235972", // заавал биш
|
|
472
|
+
});
|
|
473
|
+
store(s.sessionId, { digest: s.digest, fileName: req.body.fileName });
|
|
474
|
+
// /sign/pdf/:id/result
|
|
475
|
+
const r = await eid.session.waitForResult(sessionId);
|
|
476
|
+
const sig = eid.validator.validateSign(r, store.get(sessionId).digest, { expectedFlowType: "Notification" });
|
|
477
|
+
reply({ signature: sig.signatureValueB64 });
|
|
478
|
+
// /sign/pdf/:id/register — CA CMS-ийг өөрөө шалгана (session digest = SHA-256(signedAttrs), cert, claimedRole)
|
|
479
|
+
// registrationFromCompleted: CA dto-той яг ижил бие (hasPage илгээхгүй, pageSha256 зөвхөн хуудастай үед); cms base64 ч болно.
|
|
480
|
+
const reg = await eid.registerSignature(registrationFromCompleted(req.body, {
|
|
481
|
+
fileName: store.get(sessionId).fileName, sessionID: sessionId, onBehalfOf: "NTRMN-6235972" }));
|
|
482
|
+
reply({ verifyUrl: reg.verifyUrl });
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Зөвхөн Node (backend бүгдийг хийнэ)
|
|
486
|
+
|
|
487
|
+
```ts
|
|
488
|
+
import { registrationFromCompleted } from "@gerege-systems/eid-mongolia-sdk";
|
|
489
|
+
import { prepare, complete, PadesError } from "@gerege-systems/eid-mongolia-sdk/pades";
|
|
490
|
+
|
|
491
|
+
const p = await prepare(pdfBytes, { signerCert, verifyPage: true, fileName: "Гэрээ №12.pdf" });
|
|
492
|
+
const s = await eid.signPdfDigest({ dtbs: p.dtbs, fileName: "Гэрээ №12.pdf", signer: { documentNumber } });
|
|
493
|
+
showToUser(s.vc);
|
|
494
|
+
const r = await eid.session.waitForResult(s.sessionId);
|
|
495
|
+
const sig = eid.validator.validateSign(r, s.digest);
|
|
496
|
+
let done;
|
|
497
|
+
for (let i = 0; ; i++) {
|
|
498
|
+
try {
|
|
499
|
+
done = await complete(p.state, sig.signatureValueB64);
|
|
500
|
+
break;
|
|
501
|
+
} catch (e) {
|
|
502
|
+
if (e instanceof PadesError && e.retryable && i < 3) continue; // TSA_UNAVAILABLE / LTV_UNAVAILABLE — ижил state+гарын үсэг
|
|
503
|
+
throw e;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
await eid.registerSignature(registrationFromCompleted(done, { fileName: "Гэрээ №12.pdf", sessionID: s.sessionId }));
|
|
507
|
+
writeFileSync("signed.pdf", done.pdf);
|
|
402
508
|
```
|
|
403
509
|
|
|
404
|
-
|
|
510
|
+
`PadesError.code` (тогтвортой, бүх платформд ижил): `PDF_INVALID`, `PDF_ENCRYPTED`, `PDF_LOCKED` (DocMDP P=1),
|
|
511
|
+
`PDF_TOO_LARGE`, `PDF_TOO_MANY_SIGNATURES`, `PDF_PRIOR_SIGNATURE_INVALID`, `PDF_FOREIGN_SIGNATURE`, `SIGNER_INVALID`,
|
|
512
|
+
`REQUEST_INVALID`, `SIGNATURE_INVALID` (state хэвээр — дахин зуруулж болно), `TSA_UNAVAILABLE`, `LTV_UNAVAILABLE`
|
|
513
|
+
(`retryable`), `SELF_VALIDATION_FAILED`, `PLACEHOLDER_OVERFLOW`, `STATE_INVALID`, `INTERNAL`.
|
|
514
|
+
`state` нь бэлтгэсэн PDF-ийг агуулна — PDF-тэй ижил нууцлалтай хадгал. Формат нь Go SDK-тай ижил (хөтөчид `prepare`,
|
|
515
|
+
Go backend-д `complete` хийж болно).
|
|
516
|
+
|
|
517
|
+
0.14.0-д `eid.pdf` (`prepare`, `document`, `documentVerified`, `tokenPrepare`, `tokenFinalize`, `tokenDocument`) ба
|
|
518
|
+
`pdfTimeoutMs` / `pdfMaxBytes` устсан — PDF upload endpoint-ууд CA-д байхгүй болно.
|
|
405
519
|
|
|
406
520
|
## 4. QR ба ижил төхөөрөмж — device link v3
|
|
407
521
|
|
|
@@ -532,8 +646,9 @@ OK ирж болзошгүй. Иймд `ResponseValidator`:
|
|
|
532
646
|
| `CertChoiceInvalidError` | 409 `CERT_CHOICE_INVALID` — linked sign-ийн certificate-choice хүчингүй; `ApiError`-ийн дэд анги |
|
|
533
647
|
| `RequestInvalidError` | 400 `REQUEST_INVALID` — хүсэлт буруу (ж: `linkedSessionID` дутуу); `ApiError`-ийн дэд анги |
|
|
534
648
|
| `ApiError` | бусад HTTP алдаа (`.status`, `.body`, серверийн `.code`, `.retryAfterMs`, `.headers`, `.retryable` — ж: 404 `ORG_NOT_FOUND`) |
|
|
535
|
-
| `ResponseTooLargeError` | хариу SDK-ийн хязгаараас их (JSON 4 MiB
|
|
649
|
+
| `ResponseTooLargeError` | хариу SDK-ийн хязгаараас их (JSON 4 MiB) — `.op`, `.limit` |
|
|
536
650
|
| `NetworkError` | timeout/сүлжээ (`.op` — таних тэмдэггүй зам, `.timeout`) |
|
|
651
|
+
| `PadesError` (`/pades`) | клиент талын PAdES — `.code` (§3d), `.retryable` |
|
|
537
652
|
| `DeviceLinkError` | device-link холбоос угсрах боломжгүй (`deviceLinkBase` https биш, token/secret/lang хэлбэр, төрөлд хэрэгтэй талбар дутуу) |
|
|
538
653
|
|
|
539
654
|
## mTLS (eIDAS qualified орчин)
|
|
@@ -550,10 +665,17 @@ const eid = new EidClient({
|
|
|
550
665
|
|
|
551
666
|
```bash
|
|
552
667
|
npm install
|
|
553
|
-
npm run lint
|
|
554
|
-
npm test
|
|
668
|
+
npm run lint # tsc --noEmit
|
|
669
|
+
npm test # build + node --test (pades golden — Go reference-тэй байт-ижил)
|
|
670
|
+
npm run golden:check # test/fixtures/pades/golden + src/pades/assets ↔ бэхэлсэн Go commit
|
|
671
|
+
npm run size:pades # /pades хөтчийн bundle gzip ≤ 300 KB
|
|
555
672
|
```
|
|
556
673
|
|
|
674
|
+
`/pades`-ийн conformance fixture (golden: оролт, тестийн PKI-ийн гэрчилгээ, TSA/OCSP/CRL-ийн тогтмол хариу, хүлээгдэх
|
|
675
|
+
sha256) ба фонт/гинжийн asset-ийг Go reference-ээс `node scripts/sync-pades-golden.mjs` хуулна (`GO_SDK_COMMIT` —
|
|
676
|
+
tag `pades-golden-vN`); CI `--check`-ээр бэхэлсэн commit-тэй тулгана. Профайл: Go репогийн `pades/PROFILE.md`,
|
|
677
|
+
`PAGE_SPEC.md`, `PRECHECKS.md`, `WIRE.md`.
|
|
678
|
+
|
|
557
679
|
### Гэрээний шалгалт
|
|
558
680
|
|
|
559
681
|
SDK-ийн дууддаг RP-API зам бүр (`src/contract.ts`) live [`/.well-known/eid`](https://rp.eidmongolia.mn/.well-known/eid)-ийн
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import './errors-Z7SgLVTr.cjs';
|
|
2
|
+
|
|
1
3
|
/** Сертификатын баталгаажуулалтын түвшин (eIDAS LoA). QUALIFIED — хууль ёсны гарын үсэгт. */
|
|
2
4
|
type CertificateLevel = "ADVANCED" | "QUALIFIED" | "QSCD";
|
|
3
5
|
/** Гарын үсгийн протокол: auth → ACSP_V2, sign → RAW_DIGEST_SIGNATURE (Smart-ID v3). */
|
|
@@ -177,11 +179,6 @@ interface SessionResult {
|
|
|
177
179
|
* RP энэ талбарыг л итгэж уншина (клиентийн сонголтод биш). docs/ORG_LOGIN.md.
|
|
178
180
|
*/
|
|
179
181
|
onBehalfOf: OrgResult | null;
|
|
180
|
-
/**
|
|
181
|
-
* PAdES (`POST /pdf/sign/prepare`) session-ий `pdf` блок — PDF урсгал биш бол null (талбар алга = хуучин SDK-аар
|
|
182
|
-
* угсарсан объект). {@link PdfSessionBlock}.
|
|
183
|
-
*/
|
|
184
|
-
pdf?: PdfSessionBlock | null;
|
|
185
182
|
/**
|
|
186
183
|
* COMPLETE+OK auth session-ий `person` блок (CA бүртгэлээс: кирилл нэр, төрсөн огноо, хүйс — гэрчилгээнд байдаггүй).
|
|
187
184
|
* Зөвхөн session эзэмшигч RP-д; CA иргэнийг олоогүй бол null. ГАРЫН ҮСЭГТ ОРДОГГҮЙ — validateAuth-ийн дараа
|
|
@@ -223,35 +220,6 @@ interface TokenCertSessionBlock {
|
|
|
223
220
|
authSerialHex?: string;
|
|
224
221
|
signSerialHex?: string;
|
|
225
222
|
}
|
|
226
|
-
/** PDF баримтын төлөв: PENDING → READY (эсвэл FAILED / EXPIRED). */
|
|
227
|
-
type PdfDocumentStatus = "PENDING" | "READY" | "FAILED" | "EXPIRED";
|
|
228
|
-
/** PAdES гаралтын гарын үсэг зурагч. */
|
|
229
|
-
interface PdfSigner {
|
|
230
|
-
etsi: string;
|
|
231
|
-
certSerial: string;
|
|
232
|
-
/** Байгууллагын нэрийн өмнөөс бол байгууллагын ETSI (`NTRMN-…`) — баримтад бичигдсэн утга. */
|
|
233
|
-
onBehalfOf?: string;
|
|
234
|
-
/** CMS signer-attributes-v2-д бичигдсэн мэдүүлсэн үүрэг: «<албан тушаал>, <нэр> (NTRMN-…)». */
|
|
235
|
-
claimedRole?: string;
|
|
236
|
-
}
|
|
237
|
-
/** GET /session/{id}-ийн `pdf` объект (PAdES, CA угсарна). */
|
|
238
|
-
interface PdfSessionBlock {
|
|
239
|
-
docID: string;
|
|
240
|
-
documentStatus: PdfDocumentStatus | string;
|
|
241
|
-
/** FAILED үед — ж: `REPRESENTATION_REVOKED` (prepare-ээс хойш эрх хасагдсан, баримт үүсээгүй). */
|
|
242
|
-
errorCode?: string;
|
|
243
|
-
/** Гарын үсэгтэй PDF-ийн SHA-256 (hex) — татсан файлтай тулгана. */
|
|
244
|
-
outSha256?: string;
|
|
245
|
-
size?: number;
|
|
246
|
-
expiresAt?: string;
|
|
247
|
-
signatureLevel?: string;
|
|
248
|
-
signer?: PdfSigner;
|
|
249
|
-
validation?: {
|
|
250
|
-
indication: string;
|
|
251
|
-
ltv: boolean;
|
|
252
|
-
signatures: number;
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
223
|
/** Иргэний төлөөлж чадах нэг байгууллага (GET /organization/representations/etsi/{personEtsi}). */
|
|
256
224
|
interface Representation {
|
|
257
225
|
/** `NTRMN-<бүртгэл>` — `onBehalfOf`-д өгөх утга. */
|
|
@@ -275,6 +243,11 @@ interface Representation {
|
|
|
275
243
|
source: "REGISTRY" | "MANUAL" | string;
|
|
276
244
|
/** Эх үүсвэрийн хүнд харуулах нэр (REGISTRY → «Улсын бүртгэл», MANUAL → «Захирал нэмсэн»; хэл нь `roleLabel`-тэй ижил). Хуучин CA-д байхгүй. */
|
|
277
245
|
sourceLabel?: string;
|
|
246
|
+
/**
|
|
247
|
+
* CMS signer-attributes-v2-д бичих мэдүүлсэн үүрэг («<албан тушаал>, <нэр> (NTRMN-…)») — клиент талын PAdES-д
|
|
248
|
+
* `pades.prepare({claimedRole})`-д ЯГ ХЭВЭЭР өгнө (CA бүртгэлд дахин тооцож тулгана). Хуучин CA-д байхгүй.
|
|
249
|
+
*/
|
|
250
|
+
claimedRole?: string;
|
|
278
251
|
/** ISO 8601. */
|
|
279
252
|
validFrom: string;
|
|
280
253
|
/** ISO 8601; байхгүй = хугацаагүй. */
|
|
@@ -360,152 +333,4 @@ interface OpenOrShowQROptions {
|
|
|
360
333
|
*/
|
|
361
334
|
declare function openOrShowQR(session: DeviceLinkInput, opts: OpenOrShowQROptions): "opened" | "qr";
|
|
362
335
|
|
|
363
|
-
|
|
364
|
-
declare class EidError extends Error {
|
|
365
|
-
constructor(message: string);
|
|
366
|
-
}
|
|
367
|
-
/** HTTP хариуны нэмэлт мэдээлэл (алдааны төрлүүдэд). */
|
|
368
|
-
interface HttpErrorInit {
|
|
369
|
-
/** Хариуны header-ууд. */
|
|
370
|
-
headers?: Headers;
|
|
371
|
-
/** Retry-After (секунд эсвэл HTTP-огноо задалсан), мс; байхгүй/буруу бол undefined. */
|
|
372
|
-
retryAfterMs?: number;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* HTTP 401 — API secret буруу/байхгүй. Тохиргооны (RP secret) алдаа. CA-ийн өөрийн 401 нь JSON `{"error"[,"code"]}` —
|
|
376
|
-
* `serverMessage` (ба байвал `code`) бөглөгдөнө; JSON биш (proxy / nginx) бол хоёул undefined — үүгээр CA-ийн 401-ийг
|
|
377
|
-
* proxy-ийнхоос ялгана.
|
|
378
|
-
*/
|
|
379
|
-
declare class AuthenticationError extends EidError {
|
|
380
|
-
/** Серверийн `{"code"}`; байхгүй / JSON биш (proxy) бол undefined. */
|
|
381
|
-
readonly code?: string;
|
|
382
|
-
/** Серверийн `{"error"}` текст (логт); JSON биш (proxy) бол undefined. */
|
|
383
|
-
readonly serverMessage?: string;
|
|
384
|
-
/** Хариуны бие (таслагдаагүй текст). */
|
|
385
|
-
readonly body?: string;
|
|
386
|
-
readonly headers?: Headers;
|
|
387
|
-
constructor(message: string, init?: {
|
|
388
|
-
code?: string;
|
|
389
|
-
serverMessage?: string;
|
|
390
|
-
body?: string;
|
|
391
|
-
headers?: Headers;
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* HTTP 403 — IP allowlist/mTLS зөвшөөрөөгүй, RP-д эрх алга, эсвэл onBehalfOf-ийн төлөөлөл татгалзсан.
|
|
396
|
-
* Сервер `{"error","code"}` буцаасан бол `code` (ж: `REPRESENTATION_DENIED`) — салааллыг үүгээр хийнэ.
|
|
397
|
-
*/
|
|
398
|
-
declare class ForbiddenError extends EidError {
|
|
399
|
-
/** Серверийн тогтвортой алдааны код (`{"code"}`), байхгүй бол undefined. */
|
|
400
|
-
readonly code?: string | undefined;
|
|
401
|
-
readonly headers?: Headers;
|
|
402
|
-
/** Retry-After (мс), байхгүй бол undefined. */
|
|
403
|
-
readonly retryAfterMs?: number;
|
|
404
|
-
constructor(message: string,
|
|
405
|
-
/** Серверийн тогтвортой алдааны код (`{"code"}`), байхгүй бол undefined. */
|
|
406
|
-
code?: string | undefined, init?: HttpErrorInit);
|
|
407
|
-
}
|
|
408
|
-
/** RP-API-аас ирсэн бусад HTTP алдаа (4xx/5xx). status ба хариуны биеийг агуулна. */
|
|
409
|
-
declare class ApiError extends EidError {
|
|
410
|
-
readonly status: number;
|
|
411
|
-
readonly body: string;
|
|
412
|
-
/** Серверийн тогтвортой алдааны код (`{"error","code"}`-ийн `code`), байхгүй бол undefined. */
|
|
413
|
-
readonly code?: string | undefined;
|
|
414
|
-
readonly headers?: Headers;
|
|
415
|
-
/**
|
|
416
|
-
* Retry-After (мс, секунд эсвэл HTTP-огноо задалсан); байхгүй/буруу бол undefined. CA түр алдаанд (429
|
|
417
|
-
* PDF_PREPARE_BUSY / RATE_LIMITED, 503 DOCUMENT_PENDING / TSA_UNAVAILABLE / LTV_UNAVAILABLE г.м.) тавина.
|
|
418
|
-
*/
|
|
419
|
-
readonly retryAfterMs?: number;
|
|
420
|
-
constructor(status: number, body: string,
|
|
421
|
-
/** Серверийн тогтвортой алдааны код (`{"error","code"}`-ийн `code`), байхгүй бол undefined. */
|
|
422
|
-
code?: string | undefined, init?: HttpErrorInit);
|
|
423
|
-
/**
|
|
424
|
-
* CA-ийн түр алдаа ({@link RETRYABLE_ERROR_CODES}-ийн нэг, эсвэл 429/503 + Retry-After): `retryAfterMs`-ийн дараа
|
|
425
|
-
* ижил хүсэлтийг давтаж болно.
|
|
426
|
-
*/
|
|
427
|
-
get retryable(): boolean;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* 409 `NO_SIGNING_CERTIFICATE` — иргэнд (баримтад) идэвхтэй төхөөрөмж / SIGN credential / хүчинтэй гарын үсгийн
|
|
431
|
-
* гэрчилгээ алга: sign ба certificate-choice session start, `/pdf/sign/prepare`. Session үүсээгүй. Танихгүй
|
|
432
|
-
* лавлагаанд ч ижил хариу (бүртгэл задлахгүй) — хэрэглэгчид «eID гарын үсгийн гэрчилгээгүй» гэж харуулна.
|
|
433
|
-
*/
|
|
434
|
-
declare class NoSigningCertificateError extends ApiError {
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* 409 `CERT_CHOICE_INVALID` — linked sign-ийн `linkedSessionID` (certificate-choice) хүчингүй: өөр RP, COMPLETE+OK биш,
|
|
438
|
-
* өөр documentNumber, 5 минутаас хуучин, гэрчилгээ солигдсон, эсвэл аль хэдийн ашиглагдсан. Certificate-choice-ийг
|
|
439
|
-
* дахин эхлүүлнэ.
|
|
440
|
-
*/
|
|
441
|
-
declare class CertChoiceInvalidError extends ApiError {
|
|
442
|
-
}
|
|
443
|
-
/** 400 `REQUEST_INVALID` — хүсэлтийн бие/талбар буруу (ж: linked sign-д `linkedSessionID` дутуу). Програмын алдаа. */
|
|
444
|
-
declare class RequestInvalidError extends ApiError {
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* CA-ийн түр (давтаж болох) алдааны кодууд — `ApiError.code`. PDF_PREPARE_BUSY (429 prepare, Retry-After 5),
|
|
448
|
-
* DOCUMENT_PENDING (503 document, 5), TSA_UNAVAILABLE (503, 30), LTV_UNAVAILABLE (503, 60), RATE_LIMITED (429 токен),
|
|
449
|
-
* STATE_UNAVAILABLE (503 токен), ISSUANCE_PENDING (503 токены үр дүн, 5).
|
|
450
|
-
*/
|
|
451
|
-
type RetryableErrorCode = "PDF_PREPARE_BUSY" | "DOCUMENT_PENDING" | "TSA_UNAVAILABLE" | "LTV_UNAVAILABLE" | "RATE_LIMITED" | "STATE_UNAVAILABLE" | "ISSUANCE_PENDING";
|
|
452
|
-
/** {@link RetryableErrorCode}-ийн бүх утга. */
|
|
453
|
-
declare const RETRYABLE_ERROR_CODES: readonly RetryableErrorCode[];
|
|
454
|
-
/** RFC 9110 §10.2.3: delay-seconds эсвэл HTTP-date → мс. Буруу / өнгөрсөн / 24 цагаас их → undefined. */
|
|
455
|
-
declare function parseRetryAfter(value: string | null | undefined, now?: number): number | undefined;
|
|
456
|
-
/**
|
|
457
|
-
* Байгууллагын нэрийн өмнөөс (`onBehalfOf`) урсгалын татгалзлын кодууд — `ForbiddenError.code` /
|
|
458
|
-
* `ApiError.code`-д ирнэ. 403: REPRESENTATION_DENIED (идэвхтэй төлөөлөгч биш), REPRESENTATION_PENDING (PIN2-оор
|
|
459
|
-
* баталгаажуулаагүй), REPRESENTATION_EXPIRED (хугацааны гадна), ORG_NOT_ACTIVE, SIGNER_UNIDENTIFIED (anonymous
|
|
460
|
-
* session); 404: ORG_NOT_FOUND; PDF баримт татахад 403 REPRESENTATION_REVOKED (prepare-ээс хойш эрх хасагдсан —
|
|
461
|
-
* баримт үүсээгүй).
|
|
462
|
-
*/
|
|
463
|
-
type OnBehalfErrorCode = "REPRESENTATION_DENIED" | "REPRESENTATION_PENDING" | "REPRESENTATION_EXPIRED" | "ORG_NOT_ACTIVE" | "SIGNER_UNIDENTIFIED" | "ORG_NOT_FOUND" | "REPRESENTATION_REVOKED";
|
|
464
|
-
/** {@link OnBehalfErrorCode}-ийн бүх утга (runtime шалгалтад). */
|
|
465
|
-
declare const ON_BEHALF_ERROR_CODES: readonly OnBehalfErrorCode[];
|
|
466
|
-
/**
|
|
467
|
-
* Сүлжээ/timeout — upstream хариу өгсөнгүй. Мессеж ба `op`-д хувь хүний таних тэмдэг ОРОХГҮЙ (замын `/etsi/{…}`,
|
|
468
|
-
* `/document/{…}` → `…`) — шууд лог руу бичиж болно.
|
|
469
|
-
*/
|
|
470
|
-
declare class NetworkError extends EidError {
|
|
471
|
-
/** "GET /session/…" (таних тэмдэг хасагдсан зам). */
|
|
472
|
-
readonly op?: string;
|
|
473
|
-
/** Хүсэлт хугацаа хэтэрсэн. */
|
|
474
|
-
readonly timeout?: boolean;
|
|
475
|
-
constructor(message: string, init?: {
|
|
476
|
-
op?: string;
|
|
477
|
-
timeout?: boolean;
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
/**
|
|
481
|
-
* Хариуны бие SDK-ийн хязгаараас их (JSON 4 MiB, PDF `pdfMaxBytes`) — бие таслагдаж задлагдахгүй. `op` — method +
|
|
482
|
-
* таних тэмдэггүй зам.
|
|
483
|
-
*/
|
|
484
|
-
declare class ResponseTooLargeError extends EidError {
|
|
485
|
-
readonly op: string;
|
|
486
|
-
readonly limit: number;
|
|
487
|
-
constructor(op: string, limit: number);
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
|
|
491
|
-
* endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
|
|
492
|
-
*/
|
|
493
|
-
declare class SessionFailedError extends EidError {
|
|
494
|
-
readonly endResult: string;
|
|
495
|
-
constructor(endResult: string);
|
|
496
|
-
}
|
|
497
|
-
/**
|
|
498
|
-
* Хариуны баталгаажуулалт бүтэлгүйтсэн — cert chain итгэлцэлгүй, signature challenge-тэй
|
|
499
|
-
* таарсангүй, эсвэл certLevel хүрэлцээгүй. ЭНЭ алдаа гарвал хариунд ИТГЭХГҮЙ
|
|
500
|
-
* (хуурамч/proxy хийгдсэн байж болзошгүй).
|
|
501
|
-
*/
|
|
502
|
-
declare class ValidationError extends EidError {
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Device-link (App2App/Web2App) холбоос угсрах боломжгүй — хариунд `deviceLinkBase` байхгүй,
|
|
506
|
-
* эсвэл sessionId/vc/суурь URL хэлбэр буруу. Session-ийг дахин эхлүүлнэ; холбоосыг таахгүй.
|
|
507
|
-
*/
|
|
508
|
-
declare class DeviceLinkError extends EidError {
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
export { type AcspContext as A, type SessionState as B, type CertificateLevel as C, type DeviceLinkSession as D, EidError as E, type FlowType as F, type SignContext as G, type HashAlgorithm as H, type Interaction as I, type SignatureAlgorithmParameters as J, type SignatureProtocol as K, type TokenCertStatus as L, deviceLink as M, type NotificationSession as N, ON_BEHALF_ERROR_CODES as O, type PersonBlock as P, isMobileUserAgent as Q, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, openOrShowQR as U, ValidationError as V, parseExpiresAt as W, parseRetryAfter as X, sessionExpiry as Y, startExpiry as Z, type SessionResult as a, type PdfSessionBlock as b, type RepresentationsResponse as c, ApiError as d, AuthenticationError as e, CertChoiceInvalidError as f, DEFAULT_SIGN_SESSION_TTL_MS as g, DeviceLinkError as h, type DeviceLinkInput as i, type EndResult as j, ForbiddenError as k, type HttpErrorInit as l, type NavigatorLike as m, NetworkError as n, NoSigningCertificateError as o, type OnBehalfErrorCode as p, type OpenOrShowQROptions as q, type OrgResult as r, type PdfDocumentStatus as s, type PdfSigner as t, RETRYABLE_ERROR_CODES as u, type Representation as v, RequestInvalidError as w, ResponseTooLargeError as x, type RetryableErrorCode as y, SessionFailedError as z };
|
|
336
|
+
export { type AcspContext as A, type CertificateLevel as C, type DeviceLinkSession as D, type EndResult as E, type FlowType as F, type HashAlgorithm as H, type Interaction as I, type NotificationSession as N, type OpenOrShowQROptions as O, type PersonBlock as P, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, type SessionResult as a, type RepresentationsResponse as b, DEFAULT_SIGN_SESSION_TTL_MS as c, type DeviceLinkInput as d, type NavigatorLike as e, type OrgResult as f, type Representation as g, type SessionState as h, type SignContext as i, type SignatureAlgorithmParameters as j, type SignatureProtocol as k, type TokenCertStatus as l, deviceLink as m, isMobileUserAgent as n, openOrShowQR as o, parseExpiresAt as p, startExpiry as q, sessionExpiry as s };
|