vuer_web_sdk
Browser-embeddable FaceKom Web SDK: a React/TypeScript single-page client that runs the FaceKom self-service v2 identity-verification flow (registration, ID photos, liveness, hologram, consents, 2FA, data confirmation) inside a partner’s website. It is built with Vite into an IIFE bundle + CSS that partners load via a <script>/<link> tag pointing at their CSS (Customer Self-Service) host. The SDK talks to the FaceKom backend over a Socket.IO connection and a WebRTC peer connection; it has no backend of its own.
- Repo:
github.com/TechTeamer/vuer_web_sdk(base branchdevel, HEADf28daf7“chore: [fkqa-327] maintenance/devel (#115)”). Verifiedvuer_web_sdk/(git remote + log). - Related: architecture-overview, vuer_oss, vuer_css, customization-architecture, customization-branch-catalog.
Naming
Internal version constants are
APP_VERSION = '1.0.0'andSDK_VERSION = '2.7.6'(src/core/version.ts:1-2);package.jsonversionis1.0.0. The RELEASE.md changelog tracksSDK_VERSIONsemantics (latest entry v2.7.6).
1. Purpose & role in FaceKom
package.json:5—"description": "Facekom Web SDK".public/index.html:10-11describes the sample harness as “Sample app for FaceKom WebSDK”.docs/developer.guide.en.md:33— “The WebSDK is designed to enable FaceKom partners to integrate FaceKom features into their websites intended for their customers.”- Integration model (
docs/developer.guide.en.md:39-58): partner embeds two files from their CSS host —<script id="facekom-web-sdk-script" defer src="https://{{cssHost}}/sdk/web-sdk.js" data-css-host="{{cssHost}}"><link rel="stylesheet" href="https://{{cssHost}}/sdk/web-sdk.css">- plus a mount point
<div id="facekom-web-sdk-root">.
- The SDK reads runtime options from the
<script>tag’sdata-*attributes (src/index.tsx:8-30):cssHost,customText,registration,exit,torch,goodbye,token,language. - It is the browser-side counterpart to the FaceKom self-service feature; the backend (CSS/OSS) drives the step flow by emitting
selfService:v2:nextStepetc. over Socket.IO (src/core/self-service-v2/controller.ts:216-224).
The 10 verification-flow steps supported (src/core/self-service-v2/version.ts → SUPPORTED_STEPS, and StepType enum src/core/self-service-v2/types/step.types.ts:1-15): registration, 2-factor, consent-pep (prominent public figure), consent-ttny (beneficial owner / “tényleges tulajdonos”), customer-portrait, id-front, id-back, proof-of-address, liveness-check-v1, hologram-v2, data-confirmation, plus terminal error / good_bye. (SUPPORTED_STEPS lists the 10 sent to the backend; registration, error, good_bye are client-local.)
2. Tech stack & runtime
| Aspect | Value | Source |
|---|---|---|
| Language | TypeScript 5.5 (^5.5.4) | package.json:56 |
| UI framework | React 18 (^18.2.0) + ReactDOM | package.json:25-26 |
| Build tool | Vite 8 (^8.0.8) + @vitejs/plugin-react | package.json:51,57 |
| Component lib | MUI 5 (@mui/material ^5.10.0, @mui/icons-material), Emotion | package.json:11-16 |
| Styling | SASS (.sass modules), sass ^1.54.4 | package.json:55 |
| Realtime | socket.io-client ^4.5.1, webrtc-adapter ^9.0.1 | package.json:32,35 |
| i18n | i18next ^23.14, react-i18next ^15.0.1 (hu/en) | package.json:22,28 |
| Forms / validation | react-hook-form 7.48.2, yup ^1.4, @hookform/resolvers, class-validator ^0.15.1, class-transformer ^0.5.1 | package.json:14,17-18,27,36 |
| Other | eventemitter3, framer-motion, react-webcam, ua-parser-js, usehooks-ts, classnames, lodash.isequal | package.json:19-34 |
| Node engine | >=20.9.0 (engines); README pins v20.19.5 (“higher versions not currently supported”) | package.json:7-9, README.md:3-4 |
| Package manager | Yarn (classic v1.22.x) — yarn.lock present (147 KB); CI uses yarn install --frozen-lockfile; maintenance logs show yarn v1.22.22 | yarn.lock, .github/workflows/lint.yaml:17, maintenance/2026-05-04.md:86 |
| Lint | ESLint 9 flat config (eslint.config.mjs), @typescript-eslint v8 | package.json:43-52, eslint.config.mjs |
Node version mismatch between manifest and README
package.jsonengines.nodeallows>=20.9.0and CI lints on Node 20 and 22 (.github/workflows/lint.yaml:9), butREADME.md:3-4says only v20.19.5 is supported, “higher versions are not currently supported due to compatibility issues.” Treat Node 20.x as the safe target.
Vite 8 + decorators
Config uses
experimentalDecorators(tsconfig.app.json:10setsexperimentalDecorators: true).class-validator/class-transformerdecorators are used insrc/core/self-service-v2/config.ts. The app configtsconfig.app.jsonis the one thatincludessrc(tsconfig.app.json:31);tsconfig.node.jsonis the one scoped tovite.config.ts; roottsconfig.jsonis references-only (nocompilerOptions).
3. Build & run
Entrypoints
- Library/app entry:
src/index.tsx(vite.config.ts:16lib.entry, androllupOptions.input.app).package.json:4"main": "index.tsx". - Sample HTML host:
public/index.html(dev server opens it —vite.config.ts:31). - Build emits an IIFE bundle named
main.jsintobuild/with sourcemaps (vite.config.ts:14-28).
package.json scripts (verbatim — package.json:59-65)
| Script | Command | What it does |
|---|---|---|
start | vite | Starts the Vite dev server (HMR). Opens public/index.html, serves over HTTPS on VITE_HOST:VITE_PORT using the cert/key from .env (vite.config.ts:30-38). README: yarn start. |
build | tsc -b && NODE_ENV=production vite build | Type-checks via project references then produces the production IIFE bundle in build/. |
lint | eslint . | Lints the repo (ignores build/**). |
lint:fix | eslint --fix . | Lints and auto-fixes. |
type-check | tsc --build | Runs the TypeScript build (no emit) across tsconfig.app.json + tsconfig.node.json. |
Start command
yarn # install deps
yarn start # dev server (HTTPS, port from VITE_PORT=30480)
# production:
yarn build # -> build/ (IIFE bundle + style.css + .map)Dockerfile
No Dockerfile / docker-compose / .dockerignore in the repo.
Verified via
git ls-tree(item 3): there is no containerization in this repo. Deployment is “build the static bundle, copy it to the CSS host’s/sdk/directory” (seecopy_build.shbelow).
4. Top-level structure
Verified by git ls-tree -r HEAD (binaries/images noted, never read).
| Path | Role |
|---|---|
src/ | All first-party TypeScript/React source (see §6). |
src/core/self-service-v2/ | Headless flow engine: config, controller, state, services, steps, events, types. |
src/common/ | Cross-cutting: typed error classes, utils, WebRTC peer. |
src/ui/ | React UI: SelfServiceV2 root, per-step pages, shared components/hooks/layouts. |
src/translations/ | Bundled i18n JSON (en/, hu/) — 11 namespaces each. |
src/@types/ | Ambient declarations (global.d.ts, customColors.d.ts, i18next.d.ts, sass.d.ts, svg.d.ts). |
public/ | Sample host page (index.html), fonts, favicons/logos, manifest.json, default.css, static/translations/translations.json (custom-text demo payload). |
docs/ | Developer + branding + translations guides (en/hu) and screenshot images/. |
maintenance/ | Dated dependency-maintenance logs (yarn outdated before/after). 16 files, 2023-10 → 2026-05. |
security/ | Dated yarn audit logs (before/after). 16 files, mirrors maintenance/. |
.github/workflows/lint.yaml | CI: lint + type-check on Node 20 & 22 for PRs. |
| (root) | package.json, vite.config.ts, tsconfig*.json, eslint.config.mjs, .env, copy_build.sh, README.md, RELEASE.md, .editorconfig, .gitignore. |
No
build/,dist/, ornode_modules/are tracked (.gitignore:4-12). No Git-LFS (.gitattributesabsent — confirmed).public/font/*.woff*,public/img/**,docs/images/**are static binaries (not read).
5. First-party helper scripts (bin / shell)
There is no first-party
bin/directory.Verified via
git ls-tree(item 5). The only shell script in the repo is:
copy_build.sh(copy_build.sh:1-27) — build-and-deploy helper. Defines two bash functions:Build:echo "Running yarn & yarn build"; yarn && yarn build.Copy: copies the three build artifacts into the vuer_css SDK serving directory:build/style.css→$css_sdk_folder/web-sdk.cssbuild/vuer_web_sdk.iife.js→$css_sdk_folder/web-sdk.jsbuild/vuer_web_sdk.iife.js.map→$css_sdk_folder/vuer_web_sdk.iife.js.map
- Hard-coded paths:
sdk_folder=/workspace/vuer_web_sdk,css_sdk_folder=/workspace/vuer_css/web/sdk. RunsBuildthenCopy.
copy_build.shcouples this repo to a siblingvuer_csscheckoutIt assumes both repos live under
/workspace/and copies the bundle straight intovuer_css/web/sdk/. The output filenames it copies (vuer_web_sdk.iife.js,style.css) are Vite/Rollup defaults; they are not pinned invite.config.ts(which only setslib.name = 'main.js'andoutput.dir = 'build'). Confirm artifact names after ayarn buildbefore relying on this script.
6. Key modules / services / entities
The codebase splits cleanly into core/self-service-v2 (framework-agnostic flow engine) and ui (React rendering). The controller is the bridge.
Bootstrap
src/index.tsx— DOM bootstrap. Reads the<script id="facekom-web-sdk-script">data-*attributes into a config object (:8-30), parses an optional<script id="facekom-web-sdk-colors" type="application/json">block and applies each valid color as a--fk-{group}-{key}CSS custom property (:37-51, validated by anisColorregex:32-35), builds an MUI theme from those CSS vars (:53-120), and renders<App>insideThemeProvider. Listens forfacekom-web-sdk-exittoroot.unmount()(:128-130).src/App.tsx— instantiatesSelfServiceV2Controller(new SelfServiceV2Config(props))and orchestrates lifecycle inuseEffect:controller.checkDevices()→initialize()→start({authToken, isRegistration})(:27-32). WiresonError/onWindow(re-dispatches controller events as DOMCustomEvents,:18-25) and exposes globalswindow.facekomWebSDKExitandwindow.facekomWebSDKChangeLanguage(:35-40, typed insrc/@types/global.d.ts:4-8). HandlesonRestart(:61-68).
Flow engine — src/core/self-service-v2/
config.ts—SelfServiceV2Config(extendsSelfServiceV2ConfigPlain). Uses class-validator decorators (@IsUrl,@IsBoolean,@IsInt @Min(0),@IsArray…) to validate runtime options. Defaults:socketTimeout = 30 * SECOND,screenshotMaxWidth = 1280,screenshotMargin = 30,supportedLocales = ['hu','en'],defaultLanguage = 'hu'.transform()strips thehttps?://scheme fromcssHost(:72-74). Validates viaValidationUtils.validate(:68-70). Stores a JSON snapshot for instance comparison (:53-65).controller.ts—SelfServiceV2Controller extends SelfServiceV2EventController(≈290 lines, the heart of the SDK). Ownsconfig,state,services,steps.checkDevices()throwsDEVICE_CHECK_NO_CAMERAifcamCount === 0(:64-69).initialize()— inits services, languages, fetches settings (compat check), connects the socket, registers socket listeners (:71-96).start()— if no token orisRegistration, shows the local Registration step; otherwise calls backendselfService:v2:auth+selfService:v2:start(:131-158).- Backend-driven step routing via socket subscriptions:
selfService:v2:nextStep→changeStep,selfService:v2:stepMessage→onStepMessage,selfService:v2:end→onRoomEnd(:216-224). changeStep()— creates the next step via the factory, runsonBeforeNewStep/onSameStep, disposes the old step (:226-251).- User actions:
exit()→selfService:v2:abort,skip()→selfService:v2:skip(guards required steps),stop()→ GoodBye or exit event,setLocale()(:160-206). - Socket disconnect handling: reconnect-with-error vs terminal
SOCKET_DISCONNECTEDerror step (:112-129).
state.ts— tiny:authToken,settings,currentStep(:4-8).events.ts—SelfServiceV2EventControllerabstract base overeventemitter3; publiconRestart/onWindow/onNewStep/onUpdateStep/onError/onResetError/onInitialize/onEndsubscription API with disposable listener IDs.event-topics.ts— frozen topic constants, incl. nestedSocket.{END,NEXT_STEP,STEP_MESSAGE}.
Services (services/) — registered & initialized in order (services/index.ts:32-43)
| Service | File | Responsibility |
|---|---|---|
SocketService | socket.service.ts (123) | Socket.IO client. Connects to wss://${cssHost} (:103-104), sendRequest with per-call timeout (:85-93), subscribe-with-error-emit (:70-83), manual reconnect loop (:55-68,95-100). |
SettingsService | settings.service.ts (27) | GET https://${cssHost}/api/mobile/settings?osType=web&version=${APP_VERSION}&sdkVersion=${SDK_VERSION}; throws CompatibilityError if !isCompatible (:11-26). |
SelfServiceV2Service | self-service-v2.service.ts (109) | All backend RPCs over the socket (executeAction unwraps [errorMessage, response], throws BackendError :100-108). Auth (:15-31), photo, video, peer config, abort, debug. Manages localStorage.authToken (:33-43) and the WebRTC SelfServicePeer (:67-82). |
DeviceService | device.service.ts (93) | Enumerates mediaDevices to count mic/cam/speaker, detects mobile via UAParser, NFC capability via NDEFReader, returns DeviceInfo (:81-92). |
LanguageService | language.service.ts (157) | i18next init with bundled en/hu JSON across 11 namespaces; if isCustomText, fetches GET https://${cssHost}/sdk/translations and overlays it (:69-115). |
BaseService / service.dependencies.ts | Base classes injecting {config, services, emitter} (base.service.ts, components/service.dependencies.ts). |
Steps (steps/) — factory pattern
steps/index.ts—SelfServiceV2Steps.STEP_FACTORYmaps eachStepTypeto aBaseStepsubclass. Notablycustomer-portrait,id-front,id-back,proof-of-addressall instantiatePhotoStep(:23-34).createStepthrows on unknown type (:37-44).steps/base.step.ts—BaseStepabstract; holdsstepData, optionalhandler, scoped event-listener registration that only fires while the step is current (:30-51),dispose()removes listeners.- Step files (each exports a
*Step+ a*StepHandler):error.step.ts,registration.step.ts,two-factor.step.ts,consent-pep.step.ts,consent-ttny.step.ts,photo.step.ts,liveness-check.step.ts,hologram.step.ts,data-confirmation.step.ts,good-bye.step.ts. steps/components/step.handler.ts—StepHandlerbase:localIdcounter,isExitEnabled = config.isExit,debug()proxy. The handler is the API the React page calls (e.g.PhotoStepHandler.uploadPhoto→selfService:v2:photo:candidate,.acceptPhoto→selfService:v2:photo:finalize,photo.step.ts:26-44).
Common — src/common/
webrtc/self-service-peer.ts(SelfServicePeer, 161 lines) — wrapsRTCPeerConnection(+webrtc-adapter). Creates an offer (no audio/video receive), sends JSEP viaselfService:v2:video:peer:start, applies the remote description, then flushes ICE candidates overselfService:v2:video:peer:candidate. Emits granularlog:webrtctelemetry on every state change (:32-78).errors/— typed error hierarchy:base.error.ts,backend.error.ts,compatibility.error.ts,timeout.error.ts,validation.error.ts.utils/—async.utils.ts(createPromiseWithTimeout, used by socket),date-time.utils.ts(SECOND),number.utils.ts,validation.utils.ts(validateSync→ValidationErrorwith formatted messages,:5-23).
UI — src/ui/
index.ts— public UI export:export { default as SelfServiceV2 } from './self-service-v2/SelfServiceV2'.self-service-v2/SelfServiceV2.tsx— React class component; provides the controller via context and renders<BaseLayout><StepRouter/></BaseLayout>(:21-29).controllers/StepRouter/StepMap.tsx— maps eachStepType→ the React page component, casting the step handler to the concrete handler type and passing camera props (e.g.customer-portrait:mirrored cameraFacing="user";id-*/proof-of-address:cameraFacing="environment";liveness:user;hologram:environment) (:26-52).pages/— one folder per step:Registration,TwoFactor,ConsentPEP,ConsentTTNY,PhotoStep(withstages/Camera/AcceptPhoto/Error/Loading),LivenessCheck,Hologram,DataConfirmation,GoodBye,Error,Loading.components/— shared:ActionBar,ActionButton,Camera/CameraUI,CameraGuide,ConsentButtonGroup,ErrorDialog,ExitButton/ExitDialog,Page/PageContext,SkipButton/SkipDialog.common/hooks/—use-service.ts(memoize a service instance in a ref),use-breakpoints.ts,use-cache.ts,use-video-devices.ts.common/services/MediaService.ts(182 lines) — camera/permission helper:getUserMediapermission tracking (staticpermissions), device enumeration, torch capability/constraint support (MediaServiceTrackCapabilities.torch), highest-resolution probe (ideal 3840),localStoragedefault-camera persistence per facing mode (:32-44),convertDataURIToBinaryfor photo upload (:168-180).- Styling:
ui/common/colors.sass,global.sass,muiStyles.sass; per-component*.module.sass.
7. Configuration
.env (.env:1-5) — dev server only, read by vite.config.ts
| Var | Value | Use |
|---|---|---|
VITE_HOST | $DEV_DOMAIN | dev server host (vite.config.ts:33) |
VITE_PORT | 30480 | dev server port (vite.config.ts:32) |
VITE_SSL_CRT_FILE | ../cert/dev.crt | HTTPS cert (vite.config.ts:35) |
VITE_SSL_KEY_FILE | ../cert/dev.key | HTTPS key (vite.config.ts:36) |
VITE_CSS_HOST | "css-$DEV_DOMAIN" | fallback CSS host when data-css-host absent (src/index.tsx:20-22) |
Dev server requires TLS certs that are NOT in this repo
vite.config.ts:34-37always setsserver.httpsfromVITE_SSL_CRT_FILE/VITE_SSL_KEY_FILE(../cert/dev.crt,../cert/dev.key) — a siblingcert/directory outside the repo.$DEV_DOMAINis also an external shell var.yarn startwill fail without these. (camera/getUserMediarequires a secure context, hence HTTPS.)
Runtime config — <script data-*> → SelfServiceV2Config
Set on the embedding <script id="facekom-web-sdk-script"> and parsed in src/index.tsx:8-30:
data-* attr | Config field | Default (index.tsx) | Validation (config.ts) |
|---|---|---|---|
data-css-host | cssHost | VITE_CSS_HOST | @IsString @IsUrl (scheme stripped) |
data-token | authToken | '' | @IsString @IsOptional |
data-language | defaultLanguage | 'hu' | @IsString @IsOptional |
data-custom-text | isCustomText | false (=== 'true') | @IsBoolean |
data-registration | isRegistration | true (!== 'false') | @IsBoolean |
data-exit | isExit | true | @IsBoolean |
data-torch | isTorch | true | @IsBoolean |
data-goodbye | isGoodBye | true | @IsBoolean |
| (not from script) | socketTimeout | 30000 ms | @IsInt @Min(0) |
| (not from script) | screenshotMaxWidth / screenshotMargin | 1280 / 30 | @IsInt |
| (not from script) | supportedLocales | ['hu','en'] | @IsArray @IsString({each}) |
- Theming config: a
<script id="facekom-web-sdk-colors" type="application/json">block of--fk-*color groups (full schema inpublic/index.html:64-222) drives the MUI palette. See customization-architecture. - Validation schema: there is no AJV/getconfig. Config validation is class-validator decorators on
SelfServiceV2ConfigPlain(config.ts:6-47) executed viaValidationUtils.validate(validation.utils.ts). ServerSettingsshape is the TypeScript interface intypes/settings.types.ts(not runtime-validated). - i18n config: bundled JSON under
src/translations/{en,hu}/*.json(11 namespaces); custom-text mode overlays a remote payload (demo shape:public/static/translations/translations.json). - Build/TS config: root
tsconfig.jsonis references-only (points totsconfig.app.json+tsconfig.node.json);tsconfig.app.jsonis the app config (include: ["src"],experimentalDecorators,typeRootsincl.src/@types);tsconfig.node.json(include: ["vite.config.ts"]).
8. Tests
No test suite exists in this repo.
Verified via
git ls-tree(item 8): there are no test files (no*.test.*,*.spec.*,__tests__/,jest/vitestconfig, or test runner indevDependencies).package.jsonhas notestscript..gitignore:9references/coveragebut nothing generates it. The only automated quality gate is CI (.github/workflows/lint.yaml): on every PR,yarn install --frozen-lockfile→yarn lint→yarn type-check, run against Node 20 and 22.
9. Dependencies on other FaceKom services
All backend coupling is to the partner’s CSS host (cssHost config). No direct DB/Redis/RabbitMQ access — the SDK is a browser client.
HTTP (fetch)
| Method/URL | Purpose | Source |
|---|---|---|
GET https://${cssHost}/api/mobile/settings?osType=web&version=${APP_VERSION}&sdkVersion=${SDK_VERSION} | App/SDK compatibility + Socket.IO/screenshot settings | settings.service.ts:18 |
GET https://${cssHost}/sdk/translations | Custom-text i18n overlay (only when isCustomText) | language.service.ts:72 |
Socket.IO — wss://${cssHost} (socket.service.ts:103-104), settings from /api/mobile/settings → socketioSettings
Outgoing actions (selfServiceV2Service.executeAction / socket.emit):
selfService:v2:auth(token,versionNumber,supportedSteps,deviceType,deviceOsVersion,locale,deviceInfo) —self-service-v2.service.ts:22selfService:v2:start,selfService:v2:abort,selfService:v2:skip—self-service-v2.service.ts:89,93;controller.ts:186,197selfService:v2:photo:candidate,selfService:v2:photo:finalize—photo.step.ts:27,43selfService:v2:video:start,selfService:v2:video:peer:getConfig,selfService:v2:video:peer:start,selfService:v2:video:peer:candidate—self-service-v2.service.ts:58,85;self-service-peer.ts:74,77,132selfService:v2:debug:app—self-service-v2.service.ts:97log:webrtc—self-service-peer.ts:69
Incoming subscriptions (controller.ts:216-224):
selfService:v2:nextStep→changeStep(backend drives the step machine)selfService:v2:stepMessage→onStepMessageselfService:v2:end→onRoomEnd(deletes auth token, dispatchesfacekom-web-sdk-room-end)
WebRTC
Peer connection negotiated over the socket (SelfServicePeer); ICE/STUN/TURN config comes from the backend via selfService:v2:video:peer:getConfig (self-service-v2.service.ts:57-60). Video frames stream to the FaceKom backend for liveness/hologram.
DOM events emitted to the host page (integration contract)
facekom-web-sdk-exit, facekom-web-sdk-room-end (with detail.status), facekom-web-sdk-change-language via window.facekomWebSDKChangeLanguage(lng), window.facekomWebSDKExit() — App.tsx:18-40, public/index.html:28-35,53-57, global.d.ts:4-8.
10. Verified gotchas
App.tsxconstructs a new controller on every render
const controller = new SelfServiceV2Controller(...)is created in the component body (App.tsx:12-14), not memoized in a ref/useMemo, anduseEffecthas no dependency array (App.tsx:51-59) sosetupAndStartProcessruns after every render. Thecontroller.initialize()/start()methods self-guard with_initialized/_startedflags +console.warn(controller.ts:72-74,136-138), which is what makes this tolerable. Touch with care.
cssHostis used for bothwss://andhttps://The same host drives the Socket.IO URL (
wss://${cssHost}), the settings fetch, and the translations fetch. The scheme prefix is stripped inconfig.transform()(config.ts:72-74), so callers must pass a bare host (the developer guide showsdata-css-host="{{cssHost}}"). Partners must also configure CSP (script-src/style-src) and CORS (Access-Control-Allow-Origin) for that host (docs/developer.guide.en.mdRequirements section).
nfcEnabledis hard-codedtrue
DeviceService.getDeviceInfo()returnsnfcEnabled: trueunconditionally whilenfcCapableis detected (device.service.ts:85-91). Web NFC is Chromium-only viaNDEFReader.
Auth token persists in
localStorage
selfService:v2:authtoken is saved/read/cleared inlocalStorage['authToken'](self-service-v2.service.ts:33-43); cleared on room end (controller.ts:269). The default-camera deviceId is also persisted inlocalStorage(MediaService.ts:32-44).
registrationnamespace demo value is "Registration2"
public/static/translations/translations.json(the custom-text overlay sample) setsen.registration.page_title = "Registration2"— a placeholder in the demo payload, not the bundled default.
Outstanding known issues recorded in repo logs
maintenance/2026-05-04.mddocuments many deps held back (“Migration needed”), notablyua-parser-jscannot move to v2 due to a license change (:78-79).security/2026-05-04.mdrecords 2 moderate PostCSS advisories (npm 1117015) still present after maintenance (:39,74-75).
Unverified / gaps
- Surveyed structurally, not line-by-line: the React
src/ui/self-service-v2/pages/**andcomponents/**trees (≈90.tsx/.module.sassfiles). I readSelfServiceV2.tsx,StepMap.tsx,MediaService.ts,use-service.ts, andPhotoStephandler logic as representatives; individual page render/JSX details, per-stage components (Camera/Error/Loading stages), and.sassmodules were mapped by listing but not each read. - Steps read as representative:
photo.step.ts(+base.step.ts,step.handler.ts) fully; the other 9 step files (error/registration/two-factor/consent-*/liveness-check/hologram/data-confirmation/good-bye) were confirmed by the factory/StepMap wiring and line counts but their handler bodies were not individually read. - Translation JSON contents (
src/translations/{en,hu}/*.json, 22 files) not enumerated key-by-key. maintenance/,security/,docs/history: read the latest maintenance/security log and the developer guide head/integration sections; older dated logs and the branding/translations guides were not read in full.- Could not run anything (read-only); build artifact names in
copy_build.sh(vuer_web_sdk.iife.js,style.css) inferred from Vite/Rollup defaults, not confirmed against an actualbuild/output (none tracked). src/common/errors/*andsrc/common/utils/{async,date-time,number}.utils.tsconfirmed to exist and referenced; onlyvalidation.utils.tsread in full.
Sources
Files read in full (in vuer_web_sdk/):
package.json,README.md,RELEASE.md,vite.config.ts,.env,copy_build.sh,tsconfig.json,tsconfig.app.json,tsconfig.node.json,eslint.config.mjs,.gitignore,.editorconfig.github/workflows/lint.yamlpublic/index.html,public/manifest.jsonsrc/index.tsx,src/App.tsx,src/vite-env.d.ts,src/@types/global.d.tssrc/core/version.tssrc/core/self-service-v2/:config.ts,controller.ts,state.ts,events.ts,event-topics.tssrc/core/self-service-v2/services/:index.ts,base.service.ts,socket.service.ts,self-service-v2.service.ts,settings.service.ts,device.service.ts,language.service.ts,components/service.dependencies.tssrc/core/self-service-v2/steps/:index.ts,base.step.ts,photo.step.ts,components/step.handler.ts,components/step.dependencies.tssrc/core/self-service-v2/types/:settings.types.ts,socket-event.types.ts,step.types.ts,event.types.ts,error-message.types.ts,id.types.tssrc/common/webrtc/self-service-peer.ts,src/common/utils/validation.utils.tssrc/ui/index.ts,src/ui/self-service-v2/SelfServiceV2.tsx,src/ui/self-service-v2/controllers/StepRouter/StepMap.tsx,src/ui/common/hooks/use-service.ts,src/ui/common/services/MediaService.tsmaintenance/2026-05-04.md,security/2026-05-04.mddocs/developer.guide.en.md(head + Requirements/Integration sections)public/static/translations/translations.json(head)
Directories listed/sampled (via git ls-tree -r HEAD, not all files read):
src/ui/self-service-v2/pages/(dir),src/ui/self-service-v2/components/(dir),src/translations/(dir),src/common/errors/(dir),docs/images/(dir, binaries),public/font/,public/img/(dirs, binaries),maintenance/(dir),security/(dir)
Git (read-only): git -C vuer_web_sdk branch -a, for-each-ref, remote -v, log --oneline, ls-tree -r --name-only HEAD.