@gerege-systems/eid-mongolia-sdk 0.10.0 → 0.12.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 CHANGED
@@ -218,7 +218,8 @@ import { ForbiddenError, ApiError, ON_BEHALF_ERROR_CODES } from "@gerege-systems
218
218
 
219
219
  // 1. Иргэн сүүлийн 24 цагт танай RP-ээр нэвтэрсэн байх ёстой.
220
220
  const { representations } = await eid.organization.getRepresentations("PNOMN-12345678");
221
- // → [{ orgEtsi: "NTRMN-6235972", orgName: "Гэрэгэ Системс ХХК", role: "ceo", rightType: "ADMIN", … }]
221
+ // → [{ orgEtsi: "NTRMN-6235972", orgName: "Гэрэгэ Системс ХХК", role: "ceo", roleLabel: "Гүйцэтгэх захирал",
222
+ // rightType: "ADMIN", … }]
222
223
 
223
224
  // 2. PDF (PAdES, CA угсарна) — санал болгох урсгал.
224
225
  try {
@@ -254,10 +255,16 @@ try {
254
255
  Түр алдаа — `ApiError.retryable` үнэн, `retryAfterMs`-ийн (CA-ийн `Retry-After`, секунд эсвэл огноо) дараа давтана:
255
256
  prepare 429 `PDF_PREPARE_BUSY`, 503 `LTV_UNAVAILABLE` / `TSA_UNAVAILABLE`; document 503 `DOCUMENT_PENDING`,
256
257
  `TSA_UNAVAILABLE`, `LTV_UNAVAILABLE` (`RETRYABLE_ERROR_CODES`). `headers` — хариуны header. PDF дуудлагын хугацаа
257
- `pdfTimeoutMs` (анхдагч 80000).
258
+ `pdfTimeoutMs` (анхдагч 80000). `pdf.document` санах ойд `pdfMaxBytes` (анхдагч `DEFAULT_PDF_MAX_BYTES` = 64 MiB)
259
+ хүртэл уншина; хэтэрвэл `ResponseTooLargeError`. JSON хариу 4 MiB-ээс хэтэрвэл мөн `ResponseTooLargeError` (таслахгүй).
260
+ `getRepresentations`-ийн `raw` — серверийн түүхий JSON.
261
+
262
+ **Албан тушаал харуулахдаа `roleLabel` ашигла** (representations болон session-ий `onBehalfOf`) — `role` нь машин
263
+ утга (`ceo` / `founder` / `stakeholder` эсвэл MANAGER-т бичсэн текст), өөрөө орчуулахгүй. Хэл: `new EidClient({ …,
264
+ language: "en" })` → дуудлага бүрд `Accept-Language`; анхдагч илгээхгүй (сервер mn). Хуучин CA-д `roleLabel` байхгүй.
258
265
 
259
266
  Олон талт гэрээ: А байгууллагын гаралтыг өөрчлөлтгүй Б-ийн `prepare`-д (`docID`, өөр `onBehalfOf`) илгээнэ.
260
- Session-ий `onBehalfOf` блок (`role`/`rightType`) нь хариу угсрах үеийн бүртгэл; `pdf.signer.onBehalfOf`/`claimedRole`
267
+ Session-ий `onBehalfOf` блок (`role`/`roleLabel`/`rightType`) нь хариу угсрах үеийн бүртгэл; `pdf.signer.onBehalfOf`/`claimedRole`
261
268
  нь баримтад бичигдсэн утга.
262
269
 
263
270
  ## 3b. Иргэний PKI самбар (`PKI_READ` эрх)
@@ -281,8 +288,16 @@ verifyTokenCertificates(res, csrAuth, csrSign); // гэрчилгээ бүр CSR
281
288
  const ch = await eid.token.authChallenge();
282
289
  const digest = tokenAuthDigest(ch.rpUUID, ch.challenge); // токен CKM_ECDSA → түүхий r||s
283
290
  const who = await eid.token.authVerify(ch.challengeId, authCertDer, rs);
291
+
292
+ // токеноор PDF (PAdES, SIGN эрх) — session/утасгүй; байгууллагын токенд onBehalfOf = тухайн байгууллага
293
+ const p = await eid.pdf.tokenPrepare({ pdf, fileName: "Гэрээ.pdf", signerEtsi, certificate: signCertDer });
294
+ const rs = /* токен (PKCS#11): CKM_ECDSA(p.hashToSign) → түүхий r||s, 64 байт — p.expiresAt хүртэл */ new Uint8Array(64);
295
+ const blk = await eid.pdf.tokenFinalize(p.signingId, rs); // READY; 503 DOCUMENT_PENDING → ижил rs-ийг дахин
296
+ const signed = await eid.pdf.tokenDocument(p.signingId); // SHA-256 = blk.outSha256 тулга
284
297
  ```
285
298
 
299
+ `/token/auth/*`, `/pdf/token/*` нь CA-д байгаа ч `/.well-known/eid`-д хараахан жагсаагдаагүй (гэрээний тест WARN).
300
+
286
301
  ## 4. QR ба ижил төхөөрөмж — device link v3
287
302
 
288
303
  Иргэн өөр төхөөрөмжийн дэлгэц дээрх **QR**-ийг утсаараа уншина, эсвэл RP-ийн сайт/аппыг eID апптай **ижил
@@ -371,7 +386,12 @@ OK ирж болзошгүй. Иймд `ResponseValidator`:
371
386
 
372
387
  1. `state === COMPLETE && endResult === OK`
373
388
  2. Иргэний гэрчилгээг **trust anchor (Mongolian National Root CA)** хүртэл chain-аар баталгаажуулна
374
- (Root → National Issuing CA → Gerege Issuing CA → eID Mongolia Issuing CA → иргэн)
389
+ (Root → National Issuing CA → Gerege Issuing CA → eID Mongolia Issuing CA → иргэн) — RFC 5280 замын шалгалт
390
+ (Go SDK-ийн `x509.Certificate.Verify`-тэй ижил дүрэм): issuer нэр + AKI/SKI + гарын үсэг, CA basicConstraints +
391
+ **pathLenConstraint** (04 нь `pathlen:0`), CA-ийн keyUsage keyCertSign, CA бүрийн хугацаа, **EKU** (auth →
392
+ clientAuth, sign → emailProtection — CA-ийн профайл; CA-д EKU байвал түүнд багтах), үл таних **critical
393
+ extension** → татгалзана. **Name constraints**-тэй CA гинжинд байвал fail-closed (CA-ийн бодит гинжинд алга).
394
+ `intermediatesPem`-д 02, 03, 04-ийг бүгдийг өгнө (хариунд гинж ирдэггүй). certificatePolicies-ийг шалгахгүй.
375
395
  3. Гэрчилгээ хүчинтэй хугацаанд + шаардсан `certificateLevel` (default `QUALIFIED`)
376
396
  4. Гарын үсгийг иргэний public key-ээр шалгана:
377
397
  - **auth** → ACSP_V2 payload (`smart-id|ACSP_V2|serverRandom|rpChallenge|userChallenge|B64(rpName)|B64(brokeredRpName)|B64(SHA-256(interactions))|interactionTypeUsed|initialCallbackUrl|flowType`, hash = хүсэлтийн `hashAlgorithm`) дээр — `flowType`, `userChallenge`, `serverRandom` ба алгоритмын downgrade-ийг мөн шалгана;
@@ -404,6 +424,7 @@ OK ирж болзошгүй. Иймд `ResponseValidator`:
404
424
  | `SessionFailedError` | endResult ≠ OK (TIMEOUT, USER_REFUSED…) — `.endResult`-оор салга |
405
425
  | `ValidationError` | cert chain/signature/level шалгалт бүтэлгүйтсэн |
406
426
  | `ApiError` | бусад HTTP алдаа (`.status`, `.body`, серверийн `.code`, `.retryAfterMs`, `.headers`, `.retryable` — ж: 404 `ORG_NOT_FOUND`) |
427
+ | `ResponseTooLargeError` | хариу SDK-ийн хязгаараас их (JSON 4 MiB, PDF `pdfMaxBytes`) — `.op`, `.limit` |
407
428
  | `NetworkError` | timeout/сүлжээ (`.op` — таних тэмдэггүй зам, `.timeout`) |
408
429
  | `EidOidcError` | «eID-ээр нэвтрэх» (OIDC) — `.code`: `access_denied`, `login_required`, `state_mismatch`, `invalid_grant`, `invalid_id_token`, `server_error` … |
409
430
  | `DeviceLinkError` | device-link холбоос угсрах боломжгүй (`deviceLinkBase` https биш, token/secret/lang хэлбэр, төрөлд хэрэгтэй талбар дутуу) |
@@ -212,8 +212,16 @@ interface Representation {
212
212
  orgRegister: string;
213
213
  orgName: string;
214
214
  orgNameEn?: string;
215
- /** Бүртгэлийн албан тушаал (ХУР-аас холбогдсонд `ceo` / `founder`, MANAGER-т ADMIN-ий бичсэн текст). */
215
+ /**
216
+ * Албан тушаалын машин утга (ХУР-аас холбогдсонд `ceo` / `founder` / `stakeholder`, MANAGER-т ADMIN-ий бичсэн
217
+ * текст) — өөрөө орчуулахгүй, хүнд {@link Representation.roleLabel}-ийг харуулна.
218
+ */
216
219
  role?: string;
220
+ /**
221
+ * Албан тушаалын хүнд харуулах нэр (CA нэг газраас; хэл: `ClientConfig.language` → `Accept-Language`, анхдагч mn).
222
+ * Хуучин CA-д байхгүй.
223
+ */
224
+ roleLabel?: string;
217
225
  rightType: "ADMIN" | "MANAGER" | string;
218
226
  source: "REGISTRY" | "MANUAL" | string;
219
227
  /** ISO 8601. */
@@ -225,14 +233,18 @@ interface Representation {
225
233
  interface RepresentationsResponse {
226
234
  personEtsi: string;
227
235
  representations: Representation[];
236
+ /** Серверийн түүхий JSON (SDK задлаагүй шинэ талбарт). */
237
+ raw?: unknown;
228
238
  }
229
239
  /** Session-ий байгууллагын блок — байгууллага + тухайн иргэний эрх (бүртгэлээс real-time). */
230
240
  interface OrgResult {
231
241
  /** `NTRMN-<улсын бүртгэлийн дугаар>`. */
232
242
  orgEtsi: string;
233
243
  orgName: string | null;
234
- /** Албан тушаал (ж: "Захирал"). Эрх хураагдсан бол null. */
244
+ /** Албан тушаалын машин утга (`ceo`, MANUAL текст) — өөрөө орчуулахгүй. Эрх хураагдсан бол null. */
235
245
  role: string | null;
246
+ /** Албан тушаалын хүнд харуулах нэр ({@link Representation.roleLabel}). Эрх хураагдсан / хуучин CA бол байхгүй. */
247
+ roleLabel?: string;
236
248
  /** ADMIN | MANAGER. Эрх хураагдсан бол null. */
237
249
  rightType: string | null;
238
250
  }
@@ -395,6 +407,15 @@ declare class NetworkError extends EidError {
395
407
  timeout?: boolean;
396
408
  });
397
409
  }
410
+ /**
411
+ * Хариуны бие SDK-ийн хязгаараас их (JSON 4 MiB, PDF `pdfMaxBytes`) — бие таслагдаж задлагдахгүй. `op` — method +
412
+ * таних тэмдэггүй зам.
413
+ */
414
+ declare class ResponseTooLargeError extends EidError {
415
+ readonly op: string;
416
+ readonly limit: number;
417
+ constructor(op: string, limit: number);
418
+ }
398
419
  /**
399
420
  * Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
400
421
  * endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
@@ -417,4 +438,4 @@ declare class ValidationError extends EidError {
417
438
  declare class DeviceLinkError extends EidError {
418
439
  }
419
440
 
420
- export { type AcspContext as A, isMobileUserAgent as B, type CertificateLevel as C, type DeviceLinkSession as D, EidError as E, type FlowType as F, openOrShowQR as G, type HashAlgorithm as H, type Interaction as I, parseRetryAfter as J, type NotificationSession as N, ON_BEHALF_ERROR_CODES as O, type PersonBlock as P, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, ValidationError as V, type SessionResult as a, type PdfSessionBlock as b, type RepresentationsResponse as c, ApiError as d, AuthenticationError as e, DeviceLinkError as f, type DeviceLinkInput as g, type EndResult as h, ForbiddenError as i, type HttpErrorInit as j, type NavigatorLike as k, NetworkError as l, type OnBehalfErrorCode as m, type OpenOrShowQROptions as n, type OrgResult as o, type PdfDocumentStatus as p, type PdfSigner as q, RETRYABLE_ERROR_CODES as r, type Representation as s, type RetryableErrorCode as t, SessionFailedError as u, type SessionState as v, type SignatureAlgorithmParameters as w, type SignatureProtocol as x, type TokenCertStatus as y, deviceLink as z };
441
+ export { type AcspContext as A, deviceLink as B, type CertificateLevel as C, type DeviceLinkSession as D, EidError as E, type FlowType as F, isMobileUserAgent as G, type HashAlgorithm as H, type Interaction as I, openOrShowQR as J, parseRetryAfter as K, type NotificationSession as N, ON_BEHALF_ERROR_CODES as O, type PersonBlock as P, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, ValidationError as V, type SessionResult as a, type PdfSessionBlock as b, type RepresentationsResponse as c, ApiError as d, AuthenticationError as e, DeviceLinkError as f, type DeviceLinkInput as g, type EndResult as h, ForbiddenError as i, type HttpErrorInit as j, type NavigatorLike as k, NetworkError as l, type OnBehalfErrorCode as m, type OpenOrShowQROptions as n, type OrgResult as o, type PdfDocumentStatus as p, type PdfSigner as q, RETRYABLE_ERROR_CODES as r, type Representation as s, ResponseTooLargeError as t, type RetryableErrorCode as u, SessionFailedError as v, type SessionState as w, type SignatureAlgorithmParameters as x, type SignatureProtocol as y, type TokenCertStatus as z };
@@ -212,8 +212,16 @@ interface Representation {
212
212
  orgRegister: string;
213
213
  orgName: string;
214
214
  orgNameEn?: string;
215
- /** Бүртгэлийн албан тушаал (ХУР-аас холбогдсонд `ceo` / `founder`, MANAGER-т ADMIN-ий бичсэн текст). */
215
+ /**
216
+ * Албан тушаалын машин утга (ХУР-аас холбогдсонд `ceo` / `founder` / `stakeholder`, MANAGER-т ADMIN-ий бичсэн
217
+ * текст) — өөрөө орчуулахгүй, хүнд {@link Representation.roleLabel}-ийг харуулна.
218
+ */
216
219
  role?: string;
220
+ /**
221
+ * Албан тушаалын хүнд харуулах нэр (CA нэг газраас; хэл: `ClientConfig.language` → `Accept-Language`, анхдагч mn).
222
+ * Хуучин CA-д байхгүй.
223
+ */
224
+ roleLabel?: string;
217
225
  rightType: "ADMIN" | "MANAGER" | string;
218
226
  source: "REGISTRY" | "MANUAL" | string;
219
227
  /** ISO 8601. */
@@ -225,14 +233,18 @@ interface Representation {
225
233
  interface RepresentationsResponse {
226
234
  personEtsi: string;
227
235
  representations: Representation[];
236
+ /** Серверийн түүхий JSON (SDK задлаагүй шинэ талбарт). */
237
+ raw?: unknown;
228
238
  }
229
239
  /** Session-ий байгууллагын блок — байгууллага + тухайн иргэний эрх (бүртгэлээс real-time). */
230
240
  interface OrgResult {
231
241
  /** `NTRMN-<улсын бүртгэлийн дугаар>`. */
232
242
  orgEtsi: string;
233
243
  orgName: string | null;
234
- /** Албан тушаал (ж: "Захирал"). Эрх хураагдсан бол null. */
244
+ /** Албан тушаалын машин утга (`ceo`, MANUAL текст) — өөрөө орчуулахгүй. Эрх хураагдсан бол null. */
235
245
  role: string | null;
246
+ /** Албан тушаалын хүнд харуулах нэр ({@link Representation.roleLabel}). Эрх хураагдсан / хуучин CA бол байхгүй. */
247
+ roleLabel?: string;
236
248
  /** ADMIN | MANAGER. Эрх хураагдсан бол null. */
237
249
  rightType: string | null;
238
250
  }
@@ -395,6 +407,15 @@ declare class NetworkError extends EidError {
395
407
  timeout?: boolean;
396
408
  });
397
409
  }
410
+ /**
411
+ * Хариуны бие SDK-ийн хязгаараас их (JSON 4 MiB, PDF `pdfMaxBytes`) — бие таслагдаж задлагдахгүй. `op` — method +
412
+ * таних тэмдэггүй зам.
413
+ */
414
+ declare class ResponseTooLargeError extends EidError {
415
+ readonly op: string;
416
+ readonly limit: number;
417
+ constructor(op: string, limit: number);
418
+ }
398
419
  /**
399
420
  * Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
400
421
  * endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
@@ -417,4 +438,4 @@ declare class ValidationError extends EidError {
417
438
  declare class DeviceLinkError extends EidError {
418
439
  }
419
440
 
420
- export { type AcspContext as A, isMobileUserAgent as B, type CertificateLevel as C, type DeviceLinkSession as D, EidError as E, type FlowType as F, openOrShowQR as G, type HashAlgorithm as H, type Interaction as I, parseRetryAfter as J, type NotificationSession as N, ON_BEHALF_ERROR_CODES as O, type PersonBlock as P, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, ValidationError as V, type SessionResult as a, type PdfSessionBlock as b, type RepresentationsResponse as c, ApiError as d, AuthenticationError as e, DeviceLinkError as f, type DeviceLinkInput as g, type EndResult as h, ForbiddenError as i, type HttpErrorInit as j, type NavigatorLike as k, NetworkError as l, type OnBehalfErrorCode as m, type OpenOrShowQROptions as n, type OrgResult as o, type PdfDocumentStatus as p, type PdfSigner as q, RETRYABLE_ERROR_CODES as r, type Representation as s, type RetryableErrorCode as t, SessionFailedError as u, type SessionState as v, type SignatureAlgorithmParameters as w, type SignatureProtocol as x, type TokenCertStatus as y, deviceLink as z };
441
+ export { type AcspContext as A, deviceLink as B, type CertificateLevel as C, type DeviceLinkSession as D, EidError as E, type FlowType as F, isMobileUserAgent as G, type HashAlgorithm as H, type Interaction as I, openOrShowQR as J, parseRetryAfter as K, type NotificationSession as N, ON_BEHALF_ERROR_CODES as O, type PersonBlock as P, type RpCredentials as R, type SignatureAlgorithm as S, type TokenCertSessionBlock as T, ValidationError as V, type SessionResult as a, type PdfSessionBlock as b, type RepresentationsResponse as c, ApiError as d, AuthenticationError as e, DeviceLinkError as f, type DeviceLinkInput as g, type EndResult as h, ForbiddenError as i, type HttpErrorInit as j, type NavigatorLike as k, NetworkError as l, type OnBehalfErrorCode as m, type OpenOrShowQROptions as n, type OrgResult as o, type PdfDocumentStatus as p, type PdfSigner as q, RETRYABLE_ERROR_CODES as r, type Representation as s, ResponseTooLargeError as t, type RetryableErrorCode as u, SessionFailedError as v, type SessionState as w, type SignatureAlgorithmParameters as x, type SignatureProtocol as y, type TokenCertStatus as z };
@@ -1 +1 @@
1
- export { f as DeviceLinkError, g as DeviceLinkInput, D as DeviceLinkSession, E as EidError, k as NavigatorLike, n as OpenOrShowQROptions, z as deviceLink, B as isMobileUserAgent, G as openOrShowQR } from './browser-BWCDj8xO.cjs';
1
+ export { f as DeviceLinkError, g as DeviceLinkInput, D as DeviceLinkSession, E as EidError, k as NavigatorLike, n as OpenOrShowQROptions, B as deviceLink, G as isMobileUserAgent, J as openOrShowQR } from './browser-B_xuB7Rt.cjs';
package/dist/browser.d.ts CHANGED
@@ -1 +1 @@
1
- export { f as DeviceLinkError, g as DeviceLinkInput, D as DeviceLinkSession, E as EidError, k as NavigatorLike, n as OpenOrShowQROptions, z as deviceLink, B as isMobileUserAgent, G as openOrShowQR } from './browser-BWCDj8xO.js';
1
+ export { f as DeviceLinkError, g as DeviceLinkInput, D as DeviceLinkSession, E as EidError, k as NavigatorLike, n as OpenOrShowQROptions, B as deviceLink, G as isMobileUserAgent, J as openOrShowQR } from './browser-B_xuB7Rt.js';
package/dist/browser.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  deviceLink,
5
5
  isMobileUserAgent,
6
6
  openOrShowQR
7
- } from "./chunk-YDVPZMAL.js";
7
+ } from "./chunk-QPJDZLHR.js";
8
8
  export {
9
9
  DeviceLinkError,
10
10
  EidError,
@@ -99,6 +99,15 @@ var NetworkError = class extends EidError {
99
99
  this.timeout = init?.timeout;
100
100
  }
101
101
  };
102
+ var ResponseTooLargeError = class extends EidError {
103
+ constructor(op, limit) {
104
+ super(`${op}: \u0445\u0430\u0440\u0438\u0443 ${limit} \u0431\u0430\u0439\u0442\u0430\u0430\u0441 \u0438\u0445`);
105
+ this.op = op;
106
+ this.limit = limit;
107
+ }
108
+ op;
109
+ limit;
110
+ };
102
111
  function maskPath(path) {
103
112
  return path.split(/[?#]/)[0].replace(/\/(etsi|document)\/[^/?#\s]+/g, "/$1/\u2026");
104
113
  }
@@ -165,6 +174,7 @@ export {
165
174
  parseRetryAfter,
166
175
  ON_BEHALF_ERROR_CODES,
167
176
  NetworkError,
177
+ ResponseTooLargeError,
168
178
  maskPath,
169
179
  SessionFailedError,
170
180
  ValidationError,