@spatialwalk/avatarkit 1.0.0-beta.4 → 1.0.0-beta.40
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/CHANGELOG.md +369 -2
- package/README.md +261 -283
- package/dist/StreamingAudioPlayer-hJgaKVC3.js +506 -0
- package/dist/animation/AnimationWebSocketClient.d.ts +9 -24
- package/dist/animation/utils/eventEmitter.d.ts +0 -4
- package/dist/animation/utils/flameConverter.d.ts +3 -11
- package/dist/audio/AnimationPlayer.d.ts +4 -32
- package/dist/audio/StreamingAudioPlayer.d.ts +12 -75
- package/dist/avatar_core_wasm-i0Ocpx6q.js +2693 -0
- package/dist/avatar_core_wasm.wasm +0 -0
- package/dist/config/app-config.d.ts +1 -6
- package/dist/config/constants.d.ts +10 -25
- package/dist/config/sdk-config-loader.d.ts +2 -9
- package/dist/core/Avatar.d.ts +0 -15
- package/dist/core/AvatarController.d.ts +35 -116
- package/dist/core/AvatarDownloader.d.ts +0 -95
- package/dist/core/AvatarManager.d.ts +10 -18
- package/dist/core/AvatarSDK.d.ts +21 -0
- package/dist/core/AvatarView.d.ts +28 -110
- package/dist/core/NetworkLayer.d.ts +1 -59
- package/dist/generated/common/v1/models.d.ts +29 -0
- package/dist/generated/driveningress/v1/driveningress.d.ts +1 -12
- package/dist/generated/driveningress/v2/driveningress.d.ts +81 -3
- package/dist/generated/google/protobuf/struct.d.ts +5 -39
- package/dist/generated/google/protobuf/timestamp.d.ts +1 -103
- package/dist/index-BxhQDfJ7.js +14340 -0
- package/dist/index.d.ts +1 -6
- package/dist/index.js +17 -18
- package/dist/playground/apps/web/src/api/auth.d.ts +3 -0
- package/dist/playground/apps/web/src/api/character.d.ts +13 -0
- package/dist/playground/apps/web/src/api/index.d.ts +3 -0
- package/dist/playground/apps/web/src/api/redeem.d.ts +3 -0
- package/dist/playground/apps/web/src/composables/useDebugDataCollector.d.ts +377 -0
- package/dist/playground/apps/web/src/composables/useRealtimeAvatar.d.ts +452 -0
- package/dist/playground/apps/web/src/composables/useSubtitle.d.ts +19 -0
- package/dist/playground/apps/web/src/composables/useVAD.d.ts +49 -0
- package/dist/playground/apps/web/src/composables/useVideoCapture.d.ts +57 -0
- package/dist/playground/apps/web/src/config/app-config.d.ts +29 -0
- package/dist/playground/apps/web/src/config/realtime-config.d.ts +47 -0
- package/dist/playground/apps/web/src/config/region-config.d.ts +13 -0
- package/dist/playground/apps/web/src/constants.d.ts +14 -0
- package/dist/playground/apps/web/src/libs/vad/manager.d.ts +37 -0
- package/dist/playground/apps/web/src/libs/vad/process.worklet.d.ts +22 -0
- package/dist/playground/apps/web/src/libs/vad/simpleVad.d.ts +35 -0
- package/dist/playground/apps/web/src/libs/vad/vad.d.ts +56 -0
- package/dist/playground/apps/web/src/libs/vad/wav.d.ts +1 -0
- package/dist/playground/apps/web/src/locales/index.d.ts +2 -0
- package/dist/playground/apps/web/src/main.d.ts +0 -0
- package/dist/playground/apps/web/src/modules/i18n.d.ts +3 -0
- package/dist/playground/apps/web/src/modules/pwa.d.ts +1 -0
- package/dist/playground/apps/web/src/realtime/RealtimeWebSocketClient.d.ts +18 -0
- package/dist/playground/apps/web/src/realtime/index.d.ts +1 -0
- package/dist/playground/apps/web/src/realtime/utils/eventEmitter.d.ts +9 -0
- package/dist/playground/apps/web/src/stores/call.d.ts +173 -0
- package/dist/playground/apps/web/src/stores/character.d.ts +188 -0
- package/dist/playground/apps/web/src/stores/pwa.d.ts +7 -0
- package/dist/playground/apps/web/src/stores/region.d.ts +14 -0
- package/dist/playground/apps/web/src/stores/user.d.ts +22 -0
- package/dist/playground/apps/web/src/stores/vad.d.ts +73 -0
- package/dist/playground/apps/web/src/types/avatar.d.ts +17 -0
- package/dist/playground/apps/web/src/types/character-settings.d.ts +18 -0
- package/dist/playground/apps/web/src/types/character.d.ts +34 -0
- package/dist/playground/apps/web/src/utils/animation-interpolation.d.ts +7 -0
- package/dist/playground/apps/web/src/utils/api-client.d.ts +7 -0
- package/dist/playground/apps/web/src/utils/api-error.d.ts +13 -0
- package/dist/playground/apps/web/src/utils/dynamic-resource-loader.d.ts +43 -0
- package/dist/playground/apps/web/src/utils/error-utils.d.ts +7 -0
- package/dist/playground/apps/web/src/utils/image-optimizer.d.ts +17 -0
- package/dist/playground/apps/web/src/utils/logger.d.ts +1 -0
- package/dist/playground/apps/web/src/utils/memory-tracker.d.ts +23 -0
- package/dist/playground/apps/web/src/utils/nanoid.d.ts +1 -0
- package/dist/playground/apps/web/src/utils/posthog-tracker.d.ts +74 -0
- package/dist/playground/apps/web/src/utils/resource-cache.d.ts +25 -0
- package/dist/playground/apps/web/src/utils/sdk-preinit.d.ts +3 -0
- package/dist/playground/apps/web/src/utils/toast.d.ts +31 -0
- package/dist/playground/apps/web/vite.config.d.ts +2 -0
- package/dist/playground/bump.config.d.ts +2 -0
- package/dist/playground/eslint.config.d.ts +2 -0
- package/dist/playground/generated/buf/validate/validate.d.ts +397 -0
- package/dist/playground/generated/console/v1/collection_task.d.ts +183 -0
- package/dist/playground/generated/console/v1/console.d.ts +162 -0
- package/dist/playground/generated/console/v1/instance_management.d.ts +131 -0
- package/dist/playground/generated/console/v1/material.d.ts +163 -0
- package/dist/playground/generated/console/v1/pipetemplate.d.ts +106 -0
- package/dist/playground/generated/console/v1/task.d.ts +280 -0
- package/dist/playground/generated/driveningress/v1/driveningress.d.ts +69 -0
- package/dist/playground/generated/driveningress/v2/driveningress.d.ts +78 -0
- package/dist/playground/generated/google/api/annotations.d.ts +1 -0
- package/dist/playground/generated/google/api/http.d.ts +47 -0
- package/dist/playground/generated/google/protobuf/any.d.ts +27 -0
- package/dist/playground/generated/google/protobuf/descriptor.d.ts +513 -0
- package/dist/playground/generated/google/protobuf/duration.d.ts +27 -0
- package/dist/playground/generated/google/protobuf/struct.d.ts +74 -0
- package/dist/playground/generated/google/protobuf/timestamp.d.ts +27 -0
- package/dist/playground/generated/jsonapi/v1/base.d.ts +108 -0
- package/dist/playground/generated/platform/v1/asset_groups.d.ts +199 -0
- package/dist/playground/generated/platform/v1/assets.d.ts +141 -0
- package/dist/playground/generated/platform/v1/auth.d.ts +79 -0
- package/dist/playground/generated/platform/v1/character.d.ts +378 -0
- package/dist/playground/generated/platform/v1/character_template.d.ts +124 -0
- package/dist/playground/generated/platform/v1/collection_task.d.ts +60 -0
- package/dist/playground/generated/platform/v1/configkv.d.ts +101 -0
- package/dist/playground/generated/platform/v1/console.d.ts +29 -0
- package/dist/playground/generated/platform/v1/instance_management.d.ts +131 -0
- package/dist/playground/generated/platform/v1/material.d.ts +27 -0
- package/dist/playground/generated/platform/v1/oss.d.ts +53 -0
- package/dist/playground/generated/platform/v1/pipetemplate.d.ts +106 -0
- package/dist/playground/generated/platform/v1/provider.d.ts +141 -0
- package/dist/playground/generated/platform/v1/redeem.d.ts +83 -0
- package/dist/playground/generated/platform/v1/task.d.ts +39 -0
- package/dist/playground/generated/platform/v1/user.d.ts +142 -0
- package/dist/playground/generated/platform/v1/voice.d.ts +141 -0
- package/dist/playground/generated/realtime/v1/auth.d.ts +77 -0
- package/dist/playground/generated/realtime/v1/customized.d.ts +60 -0
- package/dist/playground/generated/realtime/v1/messages.d.ts +156 -0
- package/dist/playground/generated/realtime/v1/realtime.d.ts +67 -0
- package/dist/playground/generated/realtime/v1/redeem.d.ts +44 -0
- package/dist/playground/generated/realtime/v1/user.d.ts +150 -0
- package/dist/playground/generated/realtime/v2/realtime.d.ts +70 -0
- package/dist/playground/packages/sdk/src/index.d.ts +1 -0
- package/dist/playground/packages/sdk/tsdown.config.d.ts +2 -0
- package/dist/playground/unocss.config.d.ts +3 -0
- package/dist/renderer/RenderSystem.d.ts +1 -79
- package/dist/renderer/covariance.d.ts +0 -12
- package/dist/renderer/renderer.d.ts +6 -2
- package/dist/renderer/sortSplats.d.ts +0 -11
- package/dist/renderer/webgl/reorderData.d.ts +0 -13
- package/dist/renderer/webgl/webglRenderer.d.ts +19 -42
- package/dist/renderer/webgpu/webgpuRenderer.d.ts +18 -31
- package/dist/types/character-settings.d.ts +0 -5
- package/dist/types/character.d.ts +3 -21
- package/dist/types/index.d.ts +72 -36
- package/dist/utils/animation-interpolation.d.ts +3 -13
- package/dist/utils/client-id.d.ts +1 -0
- package/dist/utils/conversationId.d.ts +1 -0
- package/dist/utils/error-utils.d.ts +1 -25
- package/dist/utils/heartbeat-manager.d.ts +18 -0
- package/dist/utils/id-manager.d.ts +38 -0
- package/dist/utils/logger.d.ts +5 -11
- package/dist/utils/posthog-tracker.d.ts +11 -0
- package/dist/utils/usage-tracker.d.ts +5 -0
- package/dist/vanilla/vite.config.d.ts +2 -0
- package/dist/wasm/avatarCoreAdapter.d.ts +11 -97
- package/dist/wasm/avatarCoreMemory.d.ts +5 -54
- package/dist/withJoi/admin/eslint.config.d.ts +2 -0
- package/dist/withJoi/admin/generated/buf/validate/validate.d.ts +397 -0
- package/dist/withJoi/admin/generated/common/v1/models.d.ts +29 -0
- package/dist/withJoi/admin/generated/console/v1/admin_app.d.ts +77 -0
- package/dist/withJoi/admin/generated/console/v1/admin_auth.d.ts +69 -0
- package/dist/withJoi/admin/generated/console/v1/admin_config.d.ts +157 -0
- package/dist/withJoi/admin/generated/console/v1/admin_user.d.ts +84 -0
- package/dist/withJoi/admin/generated/console/v1/admin_user_character.d.ts +107 -0
- package/dist/withJoi/admin/generated/console/v1/app.d.ts +116 -0
- package/dist/withJoi/admin/generated/console/v1/auth.d.ts +199 -0
- package/dist/withJoi/admin/generated/console/v1/character.d.ts +74 -0
- package/dist/withJoi/admin/generated/console/v1/collection_task.d.ts +183 -0
- package/dist/withJoi/admin/generated/console/v1/console.d.ts +163 -0
- package/dist/withJoi/admin/generated/console/v1/instance_management.d.ts +156 -0
- package/dist/withJoi/admin/generated/console/v1/material.d.ts +180 -0
- package/dist/withJoi/admin/generated/console/v1/pipetemplate.d.ts +106 -0
- package/dist/withJoi/admin/generated/console/v1/task.d.ts +292 -0
- package/dist/withJoi/admin/generated/console/v2/async_processing.d.ts +85 -0
- package/dist/withJoi/admin/generated/google/api/annotations.d.ts +1 -0
- package/dist/withJoi/admin/generated/google/api/http.d.ts +47 -0
- package/dist/withJoi/admin/generated/google/protobuf/any.d.ts +27 -0
- package/dist/withJoi/admin/generated/google/protobuf/descriptor.d.ts +552 -0
- package/dist/withJoi/admin/generated/google/protobuf/duration.d.ts +27 -0
- package/dist/withJoi/admin/generated/google/protobuf/empty.d.ts +25 -0
- package/dist/withJoi/admin/generated/google/protobuf/struct.d.ts +74 -0
- package/dist/withJoi/admin/generated/google/protobuf/timestamp.d.ts +27 -0
- package/dist/withJoi/admin/generated/jsonapi/v1/base.d.ts +108 -0
- package/dist/withJoi/admin/generated/platform/v1/asset_groups.d.ts +204 -0
- package/dist/withJoi/admin/generated/platform/v1/assets.d.ts +141 -0
- package/dist/withJoi/admin/generated/platform/v1/auth.d.ts +79 -0
- package/dist/withJoi/admin/generated/platform/v1/character.d.ts +382 -0
- package/dist/withJoi/admin/generated/platform/v1/character_template.d.ts +124 -0
- package/dist/withJoi/admin/generated/platform/v1/christmas_characters.d.ts +118 -0
- package/dist/withJoi/admin/generated/platform/v1/collection_task.d.ts +60 -0
- package/dist/withJoi/admin/generated/platform/v1/config.d.ts +130 -0
- package/dist/withJoi/admin/generated/platform/v1/configkv.d.ts +105 -0
- package/dist/withJoi/admin/generated/platform/v1/console.d.ts +29 -0
- package/dist/withJoi/admin/generated/platform/v1/instance_management.d.ts +156 -0
- package/dist/withJoi/admin/generated/platform/v1/joi_model_apply.d.ts +100 -0
- package/dist/withJoi/admin/generated/platform/v1/material.d.ts +29 -0
- package/dist/withJoi/admin/generated/platform/v1/model_evaluation.d.ts +57 -0
- package/dist/withJoi/admin/generated/platform/v1/oss.d.ts +53 -0
- package/dist/withJoi/admin/generated/platform/v1/pipetemplate.d.ts +106 -0
- package/dist/withJoi/admin/generated/platform/v1/provider.d.ts +141 -0
- package/dist/withJoi/admin/generated/platform/v1/redeem.d.ts +83 -0
- package/dist/withJoi/admin/generated/platform/v1/sms_send_log.d.ts +95 -0
- package/dist/withJoi/admin/generated/platform/v1/task.d.ts +39 -0
- package/dist/withJoi/admin/generated/platform/v1/user.d.ts +142 -0
- package/dist/withJoi/admin/generated/platform/v1/voice.d.ts +141 -0
- package/dist/withJoi/admin/generated/realtime/v1/auth.d.ts +77 -0
- package/dist/withJoi/admin/generated/realtime/v1/customized.d.ts +60 -0
- package/dist/withJoi/admin/generated/realtime/v1/messages.d.ts +156 -0
- package/dist/withJoi/admin/generated/realtime/v1/realtime.d.ts +67 -0
- package/dist/withJoi/admin/generated/realtime/v1/redeem.d.ts +44 -0
- package/dist/withJoi/admin/generated/realtime/v1/user.d.ts +150 -0
- package/dist/withJoi/admin/generated/realtime/v2/auth.d.ts +68 -0
- package/dist/withJoi/admin/generated/realtime/v2/callback.d.ts +56 -0
- package/dist/withJoi/admin/generated/realtime/v2/joi_avatar.d.ts +204 -0
- package/dist/withJoi/admin/generated/realtime/v2/model_apply.d.ts +138 -0
- package/dist/withJoi/admin/generated/realtime/v2/realtime.d.ts +70 -0
- package/dist/withJoi/admin/generated/realtime/v2/user.d.ts +96 -0
- package/dist/withJoi/admin/openapi-ts.config.d.ts +8 -0
- package/dist/withJoi/admin/src/apis/useAssetApi.d.ts +17 -0
- package/dist/withJoi/admin/src/apis/useAssetGroupApi.d.ts +26 -0
- package/dist/withJoi/admin/src/apis/useCharacterApi.d.ts +21 -0
- package/dist/withJoi/admin/src/apis/useCharacterTemplateApi.d.ts +20 -0
- package/dist/withJoi/admin/src/apis/useChristmasCharactersApi.d.ts +40 -0
- package/dist/withJoi/admin/src/apis/useCollectionTaskApi.d.ts +64 -0
- package/dist/withJoi/admin/src/apis/useConfigApi.d.ts +16 -0
- package/dist/withJoi/admin/src/apis/useConsoleApi.d.ts +24 -0
- package/dist/withJoi/admin/src/apis/useInstanceManagementApi.d.ts +19 -0
- package/dist/withJoi/admin/src/apis/useJoiModelApplyApi.d.ts +11 -0
- package/dist/withJoi/admin/src/apis/useMaterialApi.d.ts +1 -0
- package/dist/withJoi/admin/src/apis/useOssApi.d.ts +15 -0
- package/dist/withJoi/admin/src/apis/usePipelineTemplateApi.d.ts +8 -0
- package/dist/withJoi/admin/src/apis/useProviderApi.d.ts +16 -0
- package/dist/withJoi/admin/src/apis/useRedeemApi.d.ts +5 -0
- package/dist/withJoi/admin/src/apis/useSmsSendLogApi.d.ts +14 -0
- package/dist/withJoi/admin/src/apis/useTaskApi.d.ts +66 -0
- package/dist/withJoi/admin/src/apis/useUserApi.d.ts +17 -0
- package/dist/withJoi/admin/src/apis/useVoiceApi.d.ts +15 -0
- package/dist/withJoi/admin/src/client/client/client.gen.d.ts +2 -0
- package/dist/withJoi/admin/src/client/client/index.d.ts +8 -0
- package/dist/withJoi/admin/src/client/client/types.gen.d.ts +70 -0
- package/dist/withJoi/admin/src/client/client/utils.gen.d.ts +31 -0
- package/dist/withJoi/admin/src/client/client.gen.d.ts +5 -0
- package/dist/withJoi/admin/src/client/core/auth.gen.d.ts +8 -0
- package/dist/withJoi/admin/src/client/core/bodySerializer.gen.d.ts +21 -0
- package/dist/withJoi/admin/src/client/core/params.gen.d.ts +27 -0
- package/dist/withJoi/admin/src/client/core/pathSerializer.gen.d.ts +30 -0
- package/dist/withJoi/admin/src/client/core/queryKeySerializer.gen.d.ts +9 -0
- package/dist/withJoi/admin/src/client/core/serverSentEvents.gen.d.ts +23 -0
- package/dist/withJoi/admin/src/client/core/types.gen.d.ts +32 -0
- package/dist/withJoi/admin/src/client/core/utils.gen.d.ts +19 -0
- package/dist/withJoi/admin/src/client/index.d.ts +2 -0
- package/dist/withJoi/admin/src/client/sdk.gen.d.ts +245 -0
- package/dist/withJoi/admin/src/client/types.gen.d.ts +4009 -0
- package/dist/withJoi/admin/src/client/valibot.gen.d.ts +7814 -0
- package/dist/withJoi/admin/src/components/ui/alert/index.d.ts +8 -0
- package/dist/withJoi/admin/src/components/ui/alert-dialog/index.d.ts +9 -0
- package/dist/withJoi/admin/src/components/ui/avatar/index.d.ts +9 -0
- package/dist/withJoi/admin/src/components/ui/badge/index.d.ts +6 -0
- package/dist/withJoi/admin/src/components/ui/breadcrumb/index.d.ts +7 -0
- package/dist/withJoi/admin/src/components/ui/button/index.d.ts +7 -0
- package/dist/withJoi/admin/src/components/ui/card/index.d.ts +6 -0
- package/dist/withJoi/admin/src/components/ui/checkbox/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/collapsible/index.d.ts +3 -0
- package/dist/withJoi/admin/src/components/ui/combobox/index.d.ts +9 -0
- package/dist/withJoi/admin/src/components/ui/dialog/index.d.ts +9 -0
- package/dist/withJoi/admin/src/components/ui/dropdown-menu/index.d.ts +15 -0
- package/dist/withJoi/admin/src/components/ui/filter-popover/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/form/index.d.ts +7 -0
- package/dist/withJoi/admin/src/components/ui/form/injectionKeys.d.ts +2 -0
- package/dist/withJoi/admin/src/components/ui/form/useFormField.d.ts +11 -0
- package/dist/withJoi/admin/src/components/ui/input/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/label/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/popover/index.d.ts +4 -0
- package/dist/withJoi/admin/src/components/ui/progress/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/select/index.d.ts +11 -0
- package/dist/withJoi/admin/src/components/ui/separator/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/sheet/index.d.ts +13 -0
- package/dist/withJoi/admin/src/components/ui/sidebar/index.d.ts +37 -0
- package/dist/withJoi/admin/src/components/ui/sidebar/utils.d.ts +54 -0
- package/dist/withJoi/admin/src/components/ui/skeleton/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/slider/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/switch/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/tabs/index.d.ts +4 -0
- package/dist/withJoi/admin/src/components/ui/tags-input/index.d.ts +5 -0
- package/dist/withJoi/admin/src/components/ui/textarea/index.d.ts +1 -0
- package/dist/withJoi/admin/src/components/ui/tooltip/index.d.ts +4 -0
- package/dist/withJoi/admin/src/composables/useApi.d.ts +21 -0
- package/dist/withJoi/admin/src/composables/useAppStorage.d.ts +9 -0
- package/dist/withJoi/admin/src/composables/useAssetUpload.d.ts +31 -0
- package/dist/withJoi/admin/src/composables/useCharacterForm.d.ts +139 -0
- package/dist/withJoi/admin/src/composables/useCharacterSettings.d.ts +27 -0
- package/dist/withJoi/admin/src/composables/useCharacterTemplateForm.d.ts +47 -0
- package/dist/withJoi/admin/src/composables/useCollectionTaskFilters.d.ts +12 -0
- package/dist/withJoi/admin/src/composables/useFileUpload.d.ts +26 -0
- package/dist/withJoi/admin/src/composables/useMaterialFilters.d.ts +14 -0
- package/dist/withJoi/admin/src/composables/useModelEvaluation.d.ts +11 -0
- package/dist/withJoi/admin/src/composables/useModelEvaluationWebSocket.d.ts +111 -0
- package/dist/withJoi/admin/src/composables/useModelSettings.d.ts +12 -0
- package/dist/withJoi/admin/src/composables/usePageScrollLock.d.ts +6 -0
- package/dist/withJoi/admin/src/composables/useTaskFilters.d.ts +11 -0
- package/dist/withJoi/admin/src/constants/character.d.ts +4 -0
- package/dist/withJoi/admin/src/constants/collection-task.d.ts +5 -0
- package/dist/withJoi/admin/src/constants/config-previews.d.ts +8 -0
- package/dist/withJoi/admin/src/constants/container.d.ts +1 -0
- package/dist/withJoi/admin/src/constants/links.d.ts +5 -0
- package/dist/withJoi/admin/src/constants/nav.d.ts +17 -0
- package/dist/withJoi/admin/src/constants/providers.d.ts +17 -0
- package/dist/withJoi/admin/src/constants/regions.d.ts +10 -0
- package/dist/withJoi/admin/src/constants/test-ground-voices.d.ts +19 -0
- package/dist/withJoi/admin/src/constants/ui.d.ts +4 -0
- package/dist/withJoi/admin/src/constants/voice.d.ts +12 -0
- package/dist/withJoi/admin/src/constants/volc.d.ts +135 -0
- package/dist/withJoi/admin/src/lib/cos/constants.d.ts +6 -0
- package/dist/withJoi/admin/src/lib/cos/useCosDownload.d.ts +39 -0
- package/dist/withJoi/admin/src/lib/cos/useCosUpload.d.ts +47 -0
- package/dist/withJoi/admin/src/lib/cos/useVideoInfoExtractor.d.ts +12 -0
- package/dist/withJoi/admin/src/lib/cos/utils.d.ts +4 -0
- package/dist/withJoi/admin/src/lib/utils.d.ts +49 -0
- package/dist/withJoi/admin/src/main.d.ts +0 -0
- package/dist/withJoi/admin/src/renderSystem/animation/utils/eventEmitter.d.ts +9 -0
- package/dist/withJoi/admin/src/renderSystem/animation/utils/flameConverter.d.ts +18 -0
- package/dist/withJoi/admin/src/renderSystem/audio/AnimationPlayer.d.ts +29 -0
- package/dist/withJoi/admin/src/renderSystem/audio/StreamingAudioPlayer.d.ts +57 -0
- package/dist/withJoi/admin/src/renderSystem/config/app-config.d.ts +39 -0
- package/dist/withJoi/admin/src/renderSystem/config/constants.d.ts +3 -0
- package/dist/withJoi/admin/src/renderSystem/config/sdk-config-loader.d.ts +5 -0
- package/dist/withJoi/admin/src/renderSystem/core/Avatar.d.ts +8 -0
- package/dist/withJoi/admin/src/renderSystem/core/AvatarController.d.ts +60 -0
- package/dist/withJoi/admin/src/renderSystem/core/AvatarDownloader.d.ts +38 -0
- package/dist/withJoi/admin/src/renderSystem/core/AvatarKit.d.ts +9 -0
- package/dist/withJoi/admin/src/renderSystem/core/AvatarView.d.ts +64 -0
- package/dist/withJoi/admin/src/renderSystem/generated/driveningress/v1/driveningress.d.ts +68 -0
- package/dist/withJoi/admin/src/renderSystem/generated/driveningress/v2/driveningress.d.ts +3 -0
- package/dist/withJoi/admin/src/renderSystem/generated/google/protobuf/struct.d.ts +74 -0
- package/dist/withJoi/admin/src/renderSystem/generated/google/protobuf/timestamp.d.ts +27 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/RenderSystem.d.ts +1 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/covariance.d.ts +1 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/renderer.d.ts +7 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/sortSplats.d.ts +1 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/webgl/reorderData.d.ts +1 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/webgl/webglRenderer.d.ts +27 -0
- package/dist/withJoi/admin/src/renderSystem/renderer/webgpu/webgpuRenderer.d.ts +27 -0
- package/dist/withJoi/admin/src/renderSystem/types/character-settings.d.ts +18 -0
- package/dist/withJoi/admin/src/renderSystem/types/character.d.ts +22 -0
- package/dist/withJoi/admin/src/renderSystem/types/index.d.ts +62 -0
- package/dist/withJoi/admin/src/renderSystem/utils/animation-interpolation.d.ts +7 -0
- package/dist/withJoi/admin/src/renderSystem/utils/conversationId.d.ts +1 -0
- package/dist/withJoi/admin/src/renderSystem/utils/error-utils.d.ts +3 -0
- package/dist/withJoi/admin/src/renderSystem/utils/id-manager.d.ts +12 -0
- package/dist/withJoi/admin/src/renderSystem/utils/logger.d.ts +14 -0
- package/dist/withJoi/admin/src/renderSystem/wasm/avatarCoreAdapter.d.ts +101 -0
- package/dist/withJoi/admin/src/renderSystem/wasm/avatarCoreMemory.d.ts +92 -0
- package/dist/withJoi/admin/src/stores/providers.d.ts +336 -0
- package/dist/withJoi/admin/src/stores/region.d.ts +19 -0
- package/dist/withJoi/admin/src/stores/user.d.ts +112 -0
- package/dist/withJoi/admin/src/types/character-settings.d.ts +18 -0
- package/dist/withJoi/admin/src/types/character.d.ts +117 -0
- package/dist/withJoi/admin/src/types/collection-task.d.ts +11 -0
- package/dist/withJoi/admin/src/types/config.d.ts +36 -0
- package/dist/withJoi/admin/src/types/doubao-voice.d.ts +42 -0
- package/dist/withJoi/admin/src/types/error.d.ts +5 -0
- package/dist/withJoi/admin/src/types/model-settings.d.ts +41 -0
- package/dist/withJoi/admin/src/types/task.d.ts +45 -0
- package/dist/withJoi/admin/src/types/test-ground.d.ts +36 -0
- package/dist/withJoi/admin/src/types/video-material.d.ts +130 -0
- package/dist/withJoi/admin/src/types/voice.d.ts +58 -0
- package/dist/withJoi/admin/src/utils/collection-task.d.ts +3 -0
- package/dist/withJoi/admin/src/utils/error.d.ts +1 -0
- package/dist/withJoi/admin/src/utils/hash.d.ts +20 -0
- package/dist/withJoi/admin/src/utils/model-settings.d.ts +9 -0
- package/dist/withJoi/admin/src/utils/monad.d.ts +13 -0
- package/dist/withJoi/admin/src/utils/task.d.ts +8 -0
- package/dist/withJoi/admin/unocss.config.d.ts +2 -0
- package/dist/withJoi/admin/vite.config.d.ts +2 -0
- package/dist/withJoi/admin/vue-macros.config.d.ts +2 -0
- package/dist/withJoi/bump.config.d.ts +2 -0
- package/dist/withJoi/eslint.config.d.ts +2 -0
- package/dist/withJoi/generated/buf/validate/validate.d.ts +397 -0
- package/dist/withJoi/generated/common/v1/models.d.ts +29 -0
- package/dist/withJoi/generated/console/v1/admin_app.d.ts +77 -0
- package/dist/withJoi/generated/console/v1/admin_auth.d.ts +69 -0
- package/dist/withJoi/generated/console/v1/admin_config.d.ts +157 -0
- package/dist/withJoi/generated/console/v1/admin_user.d.ts +84 -0
- package/dist/withJoi/generated/console/v1/admin_user_character.d.ts +107 -0
- package/dist/withJoi/generated/console/v1/app.d.ts +116 -0
- package/dist/withJoi/generated/console/v1/auth.d.ts +199 -0
- package/dist/withJoi/generated/console/v1/character.d.ts +74 -0
- package/dist/withJoi/generated/console/v1/collection_task.d.ts +183 -0
- package/dist/withJoi/generated/console/v1/console.d.ts +163 -0
- package/dist/withJoi/generated/console/v1/instance_management.d.ts +156 -0
- package/dist/withJoi/generated/console/v1/material.d.ts +180 -0
- package/dist/withJoi/generated/console/v1/pipetemplate.d.ts +106 -0
- package/dist/withJoi/generated/console/v1/task.d.ts +292 -0
- package/dist/withJoi/generated/console/v2/async_processing.d.ts +85 -0
- package/dist/withJoi/generated/driveningress/v1/driveningress.d.ts +69 -0
- package/dist/withJoi/generated/driveningress/v2/driveningress.d.ts +159 -0
- package/dist/withJoi/generated/google/api/annotations.d.ts +1 -0
- package/dist/withJoi/generated/google/api/http.d.ts +47 -0
- package/dist/withJoi/generated/google/protobuf/any.d.ts +27 -0
- package/dist/withJoi/generated/google/protobuf/descriptor.d.ts +552 -0
- package/dist/withJoi/generated/google/protobuf/duration.d.ts +27 -0
- package/dist/withJoi/generated/google/protobuf/empty.d.ts +25 -0
- package/dist/withJoi/generated/google/protobuf/struct.d.ts +74 -0
- package/dist/withJoi/generated/google/protobuf/timestamp.d.ts +27 -0
- package/dist/withJoi/generated/jsonapi/v1/base.d.ts +108 -0
- package/dist/withJoi/generated/platform/v1/asset_groups.d.ts +204 -0
- package/dist/withJoi/generated/platform/v1/assets.d.ts +141 -0
- package/dist/withJoi/generated/platform/v1/auth.d.ts +79 -0
- package/dist/withJoi/generated/platform/v1/character.d.ts +382 -0
- package/dist/withJoi/generated/platform/v1/character_template.d.ts +124 -0
- package/dist/withJoi/generated/platform/v1/christmas_characters.d.ts +118 -0
- package/dist/withJoi/generated/platform/v1/collection_task.d.ts +60 -0
- package/dist/withJoi/generated/platform/v1/configkv.d.ts +105 -0
- package/dist/withJoi/generated/platform/v1/console.d.ts +29 -0
- package/dist/withJoi/generated/platform/v1/instance_management.d.ts +156 -0
- package/dist/withJoi/generated/platform/v1/joi_model_apply.d.ts +100 -0
- package/dist/withJoi/generated/platform/v1/material.d.ts +29 -0
- package/dist/withJoi/generated/platform/v1/model_evaluation.d.ts +100 -0
- package/dist/withJoi/generated/platform/v1/oss.d.ts +53 -0
- package/dist/withJoi/generated/platform/v1/pipetemplate.d.ts +106 -0
- package/dist/withJoi/generated/platform/v1/provider.d.ts +141 -0
- package/dist/withJoi/generated/platform/v1/redeem.d.ts +83 -0
- package/dist/withJoi/generated/platform/v1/sms_send_log.d.ts +95 -0
- package/dist/withJoi/generated/platform/v1/task.d.ts +39 -0
- package/dist/withJoi/generated/platform/v1/user.d.ts +142 -0
- package/dist/withJoi/generated/platform/v1/voice.d.ts +141 -0
- package/dist/withJoi/generated/realtime/v1/auth.d.ts +77 -0
- package/dist/withJoi/generated/realtime/v1/customized.d.ts +60 -0
- package/dist/withJoi/generated/realtime/v1/messages.d.ts +156 -0
- package/dist/withJoi/generated/realtime/v1/realtime.d.ts +67 -0
- package/dist/withJoi/generated/realtime/v1/redeem.d.ts +44 -0
- package/dist/withJoi/generated/realtime/v1/user.d.ts +151 -0
- package/dist/withJoi/generated/realtime/v2/auth.d.ts +84 -0
- package/dist/withJoi/generated/realtime/v2/callback.d.ts +56 -0
- package/dist/withJoi/generated/realtime/v2/christmas.d.ts +146 -0
- package/dist/withJoi/generated/realtime/v2/joi_avatar.d.ts +198 -0
- package/dist/withJoi/generated/realtime/v2/model_apply.d.ts +194 -0
- package/dist/withJoi/generated/realtime/v2/realtime.d.ts +140 -0
- package/dist/withJoi/generated/realtime/v2/user.d.ts +96 -0
- package/dist/withJoi/generated/shared-proto/syncdb/v1/syncdb.d.ts +54 -0
- package/dist/withJoi/generated/syncdb/v1/syncdb.d.ts +54 -0
- package/dist/withJoi/legacy/unocss.shared.d.ts +3 -0
- package/dist/withJoi/openapi-ts.config.d.ts +8 -0
- package/dist/withJoi/packages/sdk/src/index.d.ts +1 -0
- package/dist/withJoi/packages/sdk/tsdown.config.d.ts +2 -0
- package/dist/withJoi/src/api/appearance.d.ts +5 -0
- package/dist/withJoi/src/api/auth.d.ts +7 -0
- package/dist/withJoi/src/api/character.d.ts +20 -0
- package/dist/withJoi/src/api/index.d.ts +8 -0
- package/dist/withJoi/src/api/joi-avatar.d.ts +26 -0
- package/dist/withJoi/src/api/model-apply.d.ts +21 -0
- package/dist/withJoi/src/api/oss.d.ts +13 -0
- package/dist/withJoi/src/api/provider.d.ts +11 -0
- package/dist/withJoi/src/api/redeem.d.ts +3 -0
- package/dist/withJoi/src/api/user.d.ts +9 -0
- package/dist/withJoi/src/audio/AnimationPlayer.d.ts +22 -0
- package/dist/withJoi/src/audio/StreamingAudioPlayer.d.ts +58 -0
- package/dist/withJoi/src/client/client/client.gen.d.ts +2 -0
- package/dist/withJoi/src/client/client/index.d.ts +8 -0
- package/dist/withJoi/src/client/client/types.gen.d.ts +70 -0
- package/dist/withJoi/src/client/client/utils.gen.d.ts +31 -0
- package/dist/withJoi/src/client/client.gen.d.ts +5 -0
- package/dist/withJoi/src/client/core/auth.gen.d.ts +8 -0
- package/dist/withJoi/src/client/core/bodySerializer.gen.d.ts +21 -0
- package/dist/withJoi/src/client/core/params.gen.d.ts +27 -0
- package/dist/withJoi/src/client/core/pathSerializer.gen.d.ts +30 -0
- package/dist/withJoi/src/client/core/queryKeySerializer.gen.d.ts +9 -0
- package/dist/withJoi/src/client/core/serverSentEvents.gen.d.ts +23 -0
- package/dist/withJoi/src/client/core/types.gen.d.ts +32 -0
- package/dist/withJoi/src/client/core/utils.gen.d.ts +19 -0
- package/dist/withJoi/src/client/index.d.ts +2 -0
- package/dist/withJoi/src/client/sdk.gen.d.ts +303 -0
- package/dist/withJoi/src/client/types.gen.d.ts +4988 -0
- package/dist/withJoi/src/client/valibot.gen.d.ts +10015 -0
- package/dist/withJoi/src/components/ui/avatar/index.d.ts +9 -0
- package/dist/withJoi/src/components/ui/badge/index.d.ts +6 -0
- package/dist/withJoi/src/components/ui/button/index.d.ts +7 -0
- package/dist/withJoi/src/components/ui/popover/index.d.ts +4 -0
- package/dist/withJoi/src/components/ui/select/index.d.ts +11 -0
- package/dist/withJoi/src/composables/useCameraConfig.d.ts +48 -0
- package/dist/withJoi/src/composables/useDebugDataCollector.d.ts +377 -0
- package/dist/withJoi/src/composables/usePreviewWebSocketManager.d.ts +25 -0
- package/dist/withJoi/src/composables/useRealtimeAvatar.d.ts +462 -0
- package/dist/withJoi/src/composables/useSubtitle.d.ts +19 -0
- package/dist/withJoi/src/composables/useVAD.d.ts +49 -0
- package/dist/withJoi/src/composables/useVideoCapture.d.ts +57 -0
- package/dist/withJoi/src/config/app-config.d.ts +29 -0
- package/dist/withJoi/src/config/realtime-config.d.ts +46 -0
- package/dist/withJoi/src/config/region-config.d.ts +15 -0
- package/dist/withJoi/src/constants.d.ts +22 -0
- package/dist/withJoi/src/lib/utils.d.ts +2 -0
- package/dist/withJoi/src/libs/vad/manager.d.ts +37 -0
- package/dist/withJoi/src/libs/vad/process.worklet.d.ts +22 -0
- package/dist/withJoi/src/libs/vad/simpleVad.d.ts +35 -0
- package/dist/withJoi/src/libs/vad/vad.d.ts +56 -0
- package/dist/withJoi/src/libs/vad/wav.d.ts +1 -0
- package/dist/withJoi/src/locales/index.d.ts +2 -0
- package/dist/withJoi/src/main.d.ts +0 -0
- package/dist/withJoi/src/modules/i18n.d.ts +3 -0
- package/dist/withJoi/src/modules/pwa.d.ts +1 -0
- package/dist/withJoi/src/realtime/PreviewWebSocketClient.d.ts +18 -0
- package/dist/withJoi/src/realtime/RealtimeSyncManager.d.ts +34 -0
- package/dist/withJoi/src/realtime/RealtimeWebSocketClient.d.ts +18 -0
- package/dist/withJoi/src/realtime/index.d.ts +3 -0
- package/dist/withJoi/src/realtime/types.d.ts +29 -0
- package/dist/withJoi/src/realtime/utils/audioDebug.d.ts +3 -0
- package/dist/withJoi/src/realtime/utils/audioUtils.d.ts +11 -0
- package/dist/withJoi/src/realtime/utils/eventEmitter.d.ts +9 -0
- package/dist/withJoi/src/renderer/RenderSystem.d.ts +34 -0
- package/dist/withJoi/src/renderer/covariance.d.ts +1 -0
- package/dist/withJoi/src/renderer/renderer.d.ts +7 -0
- package/dist/withJoi/src/renderer/sortSplats.d.ts +1 -0
- package/dist/withJoi/src/renderer/webgl/reorderData.d.ts +1 -0
- package/dist/withJoi/src/renderer/webgl/webglRenderer.d.ts +27 -0
- package/dist/withJoi/src/renderer/webgpu/webgpuRenderer.d.ts +26 -0
- package/dist/withJoi/src/stores/call.d.ts +176 -0
- package/dist/withJoi/src/stores/character.d.ts +188 -0
- package/dist/withJoi/src/stores/config.d.ts +59 -0
- package/dist/withJoi/src/stores/pwa.d.ts +7 -0
- package/dist/withJoi/src/stores/region.d.ts +14 -0
- package/dist/withJoi/src/stores/user.d.ts +52 -0
- package/dist/withJoi/src/stores/vad.d.ts +73 -0
- package/dist/withJoi/src/types/appearance.d.ts +30 -0
- package/dist/withJoi/src/types/avatar.d.ts +17 -0
- package/dist/withJoi/src/types/character-settings.d.ts +18 -0
- package/dist/withJoi/src/types/character.d.ts +34 -0
- package/dist/withJoi/src/types/doubao-voice.d.ts +42 -0
- package/dist/withJoi/src/utils/animation-interpolation.d.ts +7 -0
- package/dist/withJoi/src/utils/api-client.d.ts +7 -0
- package/dist/withJoi/src/utils/api-error.d.ts +13 -0
- package/dist/withJoi/src/utils/avatar-converter.d.ts +1 -0
- package/dist/withJoi/src/utils/error-utils.d.ts +3 -0
- package/dist/withJoi/src/utils/hash.d.ts +5 -0
- package/dist/withJoi/src/utils/helpers.d.ts +15 -0
- package/dist/withJoi/src/utils/image-optimizer.d.ts +17 -0
- package/dist/withJoi/src/utils/logger.d.ts +1 -0
- package/dist/withJoi/src/utils/memory-tracker.d.ts +23 -0
- package/dist/withJoi/src/utils/model-settings-utils.d.ts +29 -0
- package/dist/withJoi/src/utils/nanoid.d.ts +1 -0
- package/dist/withJoi/src/utils/posthog-tracker.d.ts +74 -0
- package/dist/withJoi/src/utils/postprocess-sdk-converter.d.ts +4 -0
- package/dist/withJoi/src/utils/postprocess-transform.d.ts +25 -0
- package/dist/withJoi/src/utils/r2-upload.d.ts +8 -0
- package/dist/withJoi/src/utils/resource-cache.d.ts +25 -0
- package/dist/withJoi/src/utils/sdk-preinit.d.ts +3 -0
- package/dist/withJoi/src/utils/toast.d.ts +30 -0
- package/dist/withJoi/src/wasm/avatarCoreAdapter.d.ts +101 -0
- package/dist/withJoi/src/wasm/avatarCoreMemory.d.ts +72 -0
- package/dist/withJoi/unocss.config.d.ts +2 -0
- package/dist/withJoi/vite.config.d.ts +2 -0
- package/package.json +15 -13
- package/dist/StreamingAudioPlayer-L87IFoao.js +0 -319
- package/dist/StreamingAudioPlayer-L87IFoao.js.map +0 -1
- package/dist/animation/AnimationWebSocketClient.d.ts.map +0 -1
- package/dist/animation/utils/eventEmitter.d.ts.map +0 -1
- package/dist/animation/utils/flameConverter.d.ts.map +0 -1
- package/dist/audio/AnimationPlayer.d.ts.map +0 -1
- package/dist/audio/StreamingAudioPlayer.d.ts.map +0 -1
- package/dist/avatar_core_wasm-D4eEi7Eh.js +0 -1666
- package/dist/avatar_core_wasm-D4eEi7Eh.js.map +0 -1
- package/dist/config/app-config.d.ts.map +0 -1
- package/dist/config/constants.d.ts.map +0 -1
- package/dist/config/sdk-config-loader.d.ts.map +0 -1
- package/dist/core/Avatar.d.ts.map +0 -1
- package/dist/core/AvatarController.d.ts.map +0 -1
- package/dist/core/AvatarDownloader.d.ts.map +0 -1
- package/dist/core/AvatarKit.d.ts +0 -66
- package/dist/core/AvatarKit.d.ts.map +0 -1
- package/dist/core/AvatarManager.d.ts.map +0 -1
- package/dist/core/AvatarView.d.ts.map +0 -1
- package/dist/core/NetworkLayer.d.ts.map +0 -1
- package/dist/generated/driveningress/v1/driveningress.d.ts.map +0 -1
- package/dist/generated/driveningress/v2/driveningress.d.ts.map +0 -1
- package/dist/generated/google/protobuf/struct.d.ts.map +0 -1
- package/dist/generated/google/protobuf/timestamp.d.ts.map +0 -1
- package/dist/index-BDxVrKwm.js +0 -5942
- package/dist/index-BDxVrKwm.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/renderer/RenderSystem.d.ts.map +0 -1
- package/dist/renderer/covariance.d.ts.map +0 -1
- package/dist/renderer/renderer.d.ts.map +0 -1
- package/dist/renderer/sortSplats.d.ts.map +0 -1
- package/dist/renderer/webgl/reorderData.d.ts.map +0 -1
- package/dist/renderer/webgl/webglRenderer.d.ts.map +0 -1
- package/dist/renderer/webgpu/webgpuRenderer.d.ts.map +0 -1
- package/dist/types/character-settings.d.ts.map +0 -1
- package/dist/types/character.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/animation-interpolation.d.ts.map +0 -1
- package/dist/utils/cls-tracker.d.ts +0 -17
- package/dist/utils/cls-tracker.d.ts.map +0 -1
- package/dist/utils/error-utils.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/reqId.d.ts +0 -20
- package/dist/utils/reqId.d.ts.map +0 -1
- package/dist/wasm/avatarCoreAdapter.d.ts.map +0 -1
- package/dist/wasm/avatarCoreMemory.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BDxVrKwm.js","sources":["../types/character.ts","../types/index.ts","../config/constants.ts","../config/app-config.ts","../core/Avatar.ts","../animation/utils/flameConverter.ts","../node_modules/.pnpm/stackframe@1.3.4/node_modules/stackframe/stackframe.js","../node_modules/.pnpm/error-stack-parser@2.1.4/node_modules/error-stack-parser/error-stack-parser.js","../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.mjs","../node_modules/.pnpm/@guiiai+logg@1.2.5/node_modules/@guiiai/logg/dist/index.mjs","../utils/cls-tracker.ts","../utils/logger.ts","../config/sdk-config-loader.ts","../wasm/avatarCoreMemory.ts","../wasm/avatarCoreAdapter.ts","../core/AvatarKit.ts","../audio/AnimationPlayer.ts","../node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js","../node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/proto-int64.js","../node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js","../node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js","../generated/driveningress/v1/driveningress.ts","../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../utils/reqId.ts","../animation/utils/eventEmitter.ts","../animation/AnimationWebSocketClient.ts","../core/NetworkLayer.ts","../core/AvatarController.ts","../utils/error-utils.ts","../core/AvatarDownloader.ts","../core/AvatarManager.ts","../renderer/sortSplats.ts","../renderer/webgl/reorderData.ts","../renderer/webgl/fragment.glsl?raw","../renderer/webgl/vertex.glsl?raw","../renderer/webgl/webglRenderer.ts","../renderer/webgpu/render.wgsl?raw","../renderer/webgpu/webgpuRenderer.ts","../renderer/RenderSystem.ts","../utils/animation-interpolation.ts","../core/AvatarView.ts"],"sourcesContent":["/**\n * iOS 兼容的角色数据类型定义\n * 对齐 iOS 版本的 API 结构\n */\n\nimport type { CharacterAsset } from '../generated/driveningress/v2/driveningress'\nimport type { CameraSettings, CharacterSettings } from './character-settings'\n\n/**\n * 角色元数据\n */\nexport type CharacterMeta = CharacterAsset & {\n characterSettings?: CharacterSettings\n}\n\nexport type PreloadResources<T> = {\n version: string\n} & T\n\nexport type PreloadCameraSettings = PreloadResources<{ camera: CameraSettings }>\n\n/**\n * 资源类型枚举\n */\nexport enum ResourceType {\n CAMERA = 'camera',\n ANIMATION_IDLE = 'frameIdle',\n ANIMATION_MONO = 'frameMono',\n AUDIO_MONO = 'audioMono',\n MODEL_SHAPE = 'shape',\n MODEL_GS = 'gsStandard',\n}\n\n/**\n * 提取所有资源 URL\n */\nexport function extractResourceUrls(meta: CharacterMeta): Record<ResourceType, string | null> {\n return {\n [ResourceType.CAMERA]: meta.camera?.resource?.remote || null,\n [ResourceType.ANIMATION_IDLE]: meta.animations?.frameIdle?.resource?.remote || null,\n [ResourceType.ANIMATION_MONO]: meta.animations?.frameMono?.resource?.remote || null,\n [ResourceType.AUDIO_MONO]: meta.animations?.audioMono?.resource?.remote || null,\n [ResourceType.MODEL_SHAPE]: meta.models?.shape?.resource?.remote || null,\n [ResourceType.MODEL_GS]: meta.models?.gsStandard?.resource?.remote || null,\n }\n}\n\n/**\n * 检查角色是否有完整的独白资源\n */\nexport function hasMonologue(meta: CharacterMeta): boolean {\n return !!(meta.animations?.frameMono?.resource?.remote && meta.animations?.audioMono?.resource?.remote)\n}\n\n/**\n * 从 RealtimeCharacter 的 modelInfo JSON 中解析是否有独白\n * modelInfo 是一个 JSON 字符串,包含角色的模型信息\n */\nexport function hasMonologueFromModelInfo(modelInfo: string): boolean {\n try {\n const parsed = JSON.parse(modelInfo)\n // 检查是否有 animations.frameMono 和 animations.audioMono\n return !!(\n parsed?.animations?.frameMono?.resource?.remote\n && parsed?.animations?.audioMono?.resource?.remote\n )\n }\n catch {\n return false\n }\n}\n","/**\n * 统一公开类型 & 接口\n */\n\n// 环境配置\nexport enum Environment {\n cn = 'cn',\n us = 'us',\n test = 'test',\n}\n\n// SDK 配置\nexport interface Configuration {\n readonly environment: Environment\n}\n\n// SDK 配置接口响应\nexport interface SdkConfigResponse {\n endpoints: {\n cn?: string\n us?: string\n test?: string\n }\n}\n\n// 加载进度\nexport enum LoadProgress {\n downloading = 'downloading',\n completed = 'completed',\n failed = 'failed',\n}\n\nexport interface LoadProgressInfo {\n type: LoadProgress\n progress?: number // 0-100\n error?: Error\n}\n\n// 连接状态\nexport enum ConnectionState {\n disconnected = 'disconnected',\n connecting = 'connecting',\n connected = 'connected',\n failed = 'failed',\n}\n\n// 数字人状态\nexport enum AvatarState {\n idle = 'idle', // 空闲状态,呈现呼吸态\n active = 'active', // 活跃中,等待可播放内容\n playing = 'playing', // 播放中\n}\n\n// 错误类型\nexport class SPAvatarError extends Error {\n constructor(message: string, public code?: string) {\n super(message)\n this.name = 'SPAvatarError'\n }\n}\n\n// ========== 渲染相关类型 ==========\n\nexport interface FlatSplatData {\n positions: Float32Array\n scales: Float32Array\n rotations: Float32Array\n colors: Float32Array\n opacities: Float32Array\n pointCount: number\n}\n\nexport interface CameraConfig {\n position: [number, number, number]\n target: [number, number, number]\n fov: number\n near: number\n far: number\n up?: [number, number, number]\n aspect?: number\n}\n\n// 渲染性能统计\nexport interface RenderPerformanceStats {\n renderTime: number // 总渲染耗时(毫秒)\n sortTime: number // 排序耗时(毫秒)\n backend: 'webgpu' | 'webgl' | null // 当前使用的渲染后端\n pointCount?: number // 当前渲染的点云数量\n}\n\n// ========== 播放模式 ==========\n\n/**\n * 播放模式\n */\nexport enum AvatarPlaybackMode {\n /** 网络模式:通过 WebSocket 发送音频,接收动画数据 */\n network = 'network',\n /** 外部数据模式:外部提供音频和动画数据, SDK 负责同步播放 */\n external = 'external',\n}\n\n/**\n * AvatarView 配置选项\n */\nexport interface AvatarViewOptions {\n /** 播放模式 */\n playbackMode?: AvatarPlaybackMode\n /** Canvas 容器 */\n container?: HTMLElement\n}\n\n// ========== 角色相关类型 ==========\n// 从 character.ts 重新导出所有角色相关类型,避免重复定义\n\nexport * from './character'\n","import { Environment } from '../types'\n\n// 腾讯云 CLS 配置\nexport const CLS_TRACK_EVENTS = import.meta.env.VITE_CLS_TRACK_EVENTS === 'true'\n\n/**\n * 根据环境获取 CLS endpoint(对齐 iOS 端)\n */\nfunction getCLSEndpoint(environment: Environment): string {\n // 如果环境变量有配置,优先使用环境变量\n if (import.meta.env.VITE_CLS_ENDPOINT) {\n return import.meta.env.VITE_CLS_ENDPOINT\n }\n \n // 否则根据环境返回默认值(对齐 iOS)\n switch (environment) {\n case Environment.cn:\n case Environment.test:\n return 'ap-chongqing.cls.tencentcs.com'\n case Environment.us:\n return 'na-siliconvalley.cls.tencentyun.com'\n default:\n return ''\n }\n}\n\n/**\n * 根据环境获取 CLS topic ID(对齐 iOS 端)\n */\nfunction getCLSTopicId(environment: Environment): string {\n // 如果环境变量有配置,优先使用环境变量\n if (import.meta.env.VITE_CLS_TOPIC_ID) {\n return import.meta.env.VITE_CLS_TOPIC_ID\n }\n \n // 否则根据环境返回默认值(对齐 iOS)\n switch (environment) {\n case Environment.cn:\n return '7fd0301a-5045-4b77-ba25-56af21682049'\n case Environment.test:\n return '4473852a-23af-425a-b7f2-75a90a28de41'\n case Environment.us:\n return 'd8972ae5-d841-498b-9777-11f9cd90fa0f'\n default:\n return ''\n }\n}\n\n/**\n * 获取 CLS 配置(需要传入环境)\n */\nexport function getCLSConfig(environment: Environment) {\n return {\n endpoint: getCLSEndpoint(environment),\n topicId: getCLSTopicId(environment),\n secretId: import.meta.env.VITE_CLS_SECRET_ID || '',\n secretKey: import.meta.env.VITE_CLS_SECRET_KEY || '',\n token: import.meta.env.VITE_CLS_TOKEN || '',\n }\n}\n\n// 兼容旧代码(如果没有环境信息,使用环境变量或空值)\nexport const CLS_CONFIG = {\n endpoint: import.meta.env.VITE_CLS_ENDPOINT || '',\n topicId: import.meta.env.VITE_CLS_TOPIC_ID || '',\n secretId: import.meta.env.VITE_CLS_SECRET_ID || '',\n secretKey: import.meta.env.VITE_CLS_SECRET_KEY || '',\n token: import.meta.env.VITE_CLS_TOKEN || '',\n}\n\nexport const ENV_TEST = !import.meta.env.VITE_ENV_PROD && (import.meta.env.VITE_ENV_TEST === 'true' || import.meta.env.DEV)\n\n/**\n * Check if URL has debug=1 parameter\n */\nfunction hasDebugParam(): boolean {\n if (typeof window === 'undefined') {\n return false\n }\n const params = new URLSearchParams(window.location.search)\n return params.get('debug') === '1'\n}\n\n/**\n * Comprehensive debug mode check\n * Returns true if:\n * - VITE_ENV_TEST is 'true', OR\n * - Running in DEV mode, OR\n * - URL has debug=1 parameter\n */\nexport function isDebugMode(): boolean {\n return ENV_TEST || hasDebugParam()\n}\n","import { ENV_TEST, isDebugMode } from './constants'\n\nexport const APP_CONFIG = {\n testEnv: ENV_TEST,\n // Dynamic debug mode check (includes URL parameter)\n get debug() {\n return isDebugMode()\n },\n\n rendering: {\n /**\n * 排序模式\n * - 'balance': 性能优先,首帧排序后复用(默认)\n * - 'quality': 质量优先,每帧重新排序\n */\n sortMode: 'balance' as 'balance' | 'quality',\n },\n\n camera: {\n position: [-0.02, -0.013, 1.5] as [number, number, number],\n target: [0, 0, 0] as [number, number, number],\n fov: 22,\n near: 0.01,\n far: 100,\n },\n\n animation: {\n fps: 25, // 动画帧率(从 CharacterMeta 加载动画资源)\n },\n\n audio: {\n sampleRate: 16000, // 音频采样率(后端要求 16kHz)\n },\n\n avatar: {\n baseAssetsPath: '',\n wasmPath: './wasm/avatar_core_wasm.js',\n },\n\n // FLAME 全局模板资源 CDN\n // 这些资源是所有角色共享的基础模板\n flame: {\n cdnBaseUrl: 'https://cdn.spatialwalk.top/public',\n resources: {\n flameModel: 'model.pb',\n flameTemplate: 'fm/template.pb',\n teethPb: 'fm/teeth.pb',\n teethNpz: 'teeth.npz',\n },\n },\n\n wasm: {\n logLevel: 'basic' as 'basic' | 'verbose',\n enableValidation: false,\n enablePerformanceMetrics: true,\n },\n}\n","/**\n * Avatar:数字人模型\n * 构造函数:not public(由 AvatarManager 加载后返回数字人模型实例)\n * 公开属性:only id(其他字段都不公开)\n */\n\nimport type { CharacterMeta } from '../types'\nimport type { PreloadResult } from './AvatarDownloader'\n\nexport class Avatar {\n public readonly id: string\n private characterMeta: CharacterMeta\n private resources: PreloadResult\n\n /**\n * 构造函数(内部使用)\n * @param id 数字人 ID\n * @param characterMeta 角色元数据\n * @param resources 资源数据\n */\n constructor(id: string, characterMeta: CharacterMeta, resources: PreloadResult) {\n this.id = id\n this.characterMeta = characterMeta\n this.resources = resources\n }\n\n /**\n * 获取角色元数据(内部使用)\n */\n getCharacterMeta(): CharacterMeta {\n return this.characterMeta\n }\n\n /**\n * 获取资源数据(内部使用)\n */\n getResources(): PreloadResult {\n return this.resources\n }\n}\n","/**\n * Convert proto Flame to WASM FlameParams\n */\n\nimport type { Flame } from '../../generated/driveningress/v1/driveningress'\n\nexport interface FlameParams {\n shape_params?: number[]\n expr_params?: number[]\n rotation?: number[]\n translation?: number[]\n neck_pose?: number[]\n jaw_pose?: number[]\n eyes_pose?: number[]\n eyelid?: number[]\n has_eyelid?: boolean\n}\n\n/**\n * Convert proto Flame to WASM FlameParams format\n */\nexport function convertProtoFlameToWasmParams(protoFlame: Flame): FlameParams {\n return {\n translation: protoFlame.translation || [0, 0, 0],\n rotation: protoFlame.rotation || [0, 0, 0],\n neck_pose: protoFlame.neckPose || [0, 0, 0],\n jaw_pose: protoFlame.jawPose || [0, 0, 0],\n eyes_pose: protoFlame.eyePose || [0, 0, 0, 0, 0, 0],\n eyelid: protoFlame.eyeLid || [0, 0],\n expr_params: protoFlame.expression || [],\n shape_params: [], // Realtime doesn't provide shape params, use default\n has_eyelid: (protoFlame.eyeLid?.length || 0) > 0,\n }\n}\n\n/**\n * Convert WASM FlameParams to proto Flame format\n * Used for transition animation from idle to speaking\n */\nexport function convertWasmParamsToProtoFlame(wasmParams: FlameParams): Flame {\n return {\n translation: wasmParams.translation || [0, 0, 0],\n rotation: wasmParams.rotation || [0, 0, 0],\n neckPose: wasmParams.neck_pose || [0, 0, 0],\n jawPose: wasmParams.jaw_pose || [0, 0, 0],\n eyePose: wasmParams.eyes_pose || [0, 0, 0, 0, 0, 0],\n eyeLid: wasmParams.eyelid || [0, 0],\n expression: wasmParams.expr_params || [],\n }\n}\n\n/**\n * Create a neutral proto Flame (zero pose)\n */\nexport function createNeutralFlameProto(): Flame {\n return {\n translation: [0, 0, 0],\n rotation: [0, 0, 0],\n neckPose: [0, 0, 0],\n jawPose: [0, 0, 0],\n eyePose: [0, 0, 0, 0, 0, 0],\n eyeLid: [0, 0],\n expression: [],\n }\n}\n","(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('stackframe', [], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.StackFrame = factory();\n }\n}(this, function() {\n 'use strict';\n function _isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.substring(1);\n }\n\n function _getter(p) {\n return function() {\n return this[p];\n };\n }\n\n var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];\n var numericProps = ['columnNumber', 'lineNumber'];\n var stringProps = ['fileName', 'functionName', 'source'];\n var arrayProps = ['args'];\n var objectProps = ['evalOrigin'];\n\n var props = booleanProps.concat(numericProps, stringProps, arrayProps, objectProps);\n\n function StackFrame(obj) {\n if (!obj) return;\n for (var i = 0; i < props.length; i++) {\n if (obj[props[i]] !== undefined) {\n this['set' + _capitalize(props[i])](obj[props[i]]);\n }\n }\n }\n\n StackFrame.prototype = {\n getArgs: function() {\n return this.args;\n },\n setArgs: function(v) {\n if (Object.prototype.toString.call(v) !== '[object Array]') {\n throw new TypeError('Args must be an Array');\n }\n this.args = v;\n },\n\n getEvalOrigin: function() {\n return this.evalOrigin;\n },\n setEvalOrigin: function(v) {\n if (v instanceof StackFrame) {\n this.evalOrigin = v;\n } else if (v instanceof Object) {\n this.evalOrigin = new StackFrame(v);\n } else {\n throw new TypeError('Eval Origin must be an Object or StackFrame');\n }\n },\n\n toString: function() {\n var fileName = this.getFileName() || '';\n var lineNumber = this.getLineNumber() || '';\n var columnNumber = this.getColumnNumber() || '';\n var functionName = this.getFunctionName() || '';\n if (this.getIsEval()) {\n if (fileName) {\n return '[eval] (' + fileName + ':' + lineNumber + ':' + columnNumber + ')';\n }\n return '[eval]:' + lineNumber + ':' + columnNumber;\n }\n if (functionName) {\n return functionName + ' (' + fileName + ':' + lineNumber + ':' + columnNumber + ')';\n }\n return fileName + ':' + lineNumber + ':' + columnNumber;\n }\n };\n\n StackFrame.fromString = function StackFrame$$fromString(str) {\n var argsStartIndex = str.indexOf('(');\n var argsEndIndex = str.lastIndexOf(')');\n\n var functionName = str.substring(0, argsStartIndex);\n var args = str.substring(argsStartIndex + 1, argsEndIndex).split(',');\n var locationString = str.substring(argsEndIndex + 1);\n\n if (locationString.indexOf('@') === 0) {\n var parts = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString, '');\n var fileName = parts[1];\n var lineNumber = parts[2];\n var columnNumber = parts[3];\n }\n\n return new StackFrame({\n functionName: functionName,\n args: args || undefined,\n fileName: fileName,\n lineNumber: lineNumber || undefined,\n columnNumber: columnNumber || undefined\n });\n };\n\n for (var i = 0; i < booleanProps.length; i++) {\n StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\n StackFrame.prototype['set' + _capitalize(booleanProps[i])] = (function(p) {\n return function(v) {\n this[p] = Boolean(v);\n };\n })(booleanProps[i]);\n }\n\n for (var j = 0; j < numericProps.length; j++) {\n StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);\n StackFrame.prototype['set' + _capitalize(numericProps[j])] = (function(p) {\n return function(v) {\n if (!_isNumber(v)) {\n throw new TypeError(p + ' must be a Number');\n }\n this[p] = Number(v);\n };\n })(numericProps[j]);\n }\n\n for (var k = 0; k < stringProps.length; k++) {\n StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);\n StackFrame.prototype['set' + _capitalize(stringProps[k])] = (function(p) {\n return function(v) {\n this[p] = String(v);\n };\n })(stringProps[k]);\n }\n\n return StackFrame;\n}));\n","(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('error-stack-parser', ['stackframe'], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(require('stackframe'));\n } else {\n root.ErrorStackParser = factory(root.StackFrame);\n }\n}(this, function ErrorStackParser(StackFrame) {\n 'use strict';\n\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\n\n return {\n /**\n * Given an Error object, extract the most information from it.\n *\n * @param {Error} error object\n * @return {Array} of StackFrames\n */\n parse: function ErrorStackParser$$parse(error) {\n if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n } else if (error.stack) {\n return this.parseFFOrSafari(error);\n } else {\n throw new Error('Cannot parse given Error object');\n }\n },\n\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n var regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function(line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^()]*)|(,.*$)/g, '');\n }\n var sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(').replace(/^.*?\\s+/, '');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n var location = sanitizedLine.match(/ (\\(.+\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine;\n\n // if a location was matched, pass it to extractLocation() otherwise pass all sanitizedLine\n // because this line doesn't have function name\n var locationParts = this.extractLocation(location ? location[1] : sanitizedLine);\n var functionName = location && sanitizedLine || undefined;\n var fileName = ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\n\n return new StackFrame({\n functionName: functionName,\n fileName: fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n },\n\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function(line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, ':$1');\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line\n });\n } else {\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n var matches = line.match(functionNameRegex);\n var functionName = matches && matches[1] ? matches[1] : undefined;\n var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }\n }, this);\n },\n\n parseOpera: function ErrorStackParser$$parseOpera(e) {\n if (!e.stacktrace || (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n } else if (!e.stack) {\n return this.parseOpera10(e);\n } else {\n return this.parseOpera11(e);\n }\n },\n\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n }));\n }\n }\n\n return result;\n },\n\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n })\n );\n }\n }\n\n return result;\n },\n\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n }, this);\n\n return filtered.map(function(line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = (tokens.shift() || '');\n var functionName = functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n var argsRaw;\n if (functionCall.match(/\\(([^)]*)\\)/)) {\n argsRaw = functionCall.replace(/^[^(]+\\(([^)]*)\\)$/, '$1');\n }\n var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?\n undefined : argsRaw.split(',');\n\n return new StackFrame({\n functionName: functionName,\n args: args,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n }\n };\n}));\n","let _lazyMatch = () => { var __lib__=(()=>{var m=Object.defineProperty,V=Object.getOwnPropertyDescriptor,G=Object.getOwnPropertyNames,T=Object.prototype.hasOwnProperty,q=(r,e)=>{for(var n in e)m(r,n,{get:e[n],enumerable:true});},H=(r,e,n,a)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let t of G(e))!T.call(r,t)&&t!==n&&m(r,t,{get:()=>e[t],enumerable:!(a=V(e,t))||a.enumerable});return r},J=r=>H(m({},\"__esModule\",{value:true}),r),w={};q(w,{default:()=>re});var A=r=>Array.isArray(r),d=r=>typeof r==\"function\",Q=r=>r.length===0,W=r=>typeof r==\"number\",K=r=>typeof r==\"object\"&&r!==null,X=r=>r instanceof RegExp,b=r=>typeof r==\"string\",h=r=>r===void 0,Y=r=>{const e=new Map;return n=>{const a=e.get(n);if(a)return a;const t=r(n);return e.set(n,t),t}},rr=(r,e,n={})=>{const a={cache:{},input:r,index:0,indexMax:0,options:n,output:[]};if(v(e)(a)&&a.index===r.length)return a.output;throw new Error(`Failed to parse at index ${a.indexMax}`)},i=(r,e)=>A(r)?er(r,e):b(r)?ar(r,e):nr(r,e),er=(r,e)=>{const n={};for(const a of r){if(a.length!==1)throw new Error(`Invalid character: \"${a}\"`);const t=a.charCodeAt(0);n[t]=true;}return a=>{const t=a.index,o=a.input;for(;a.index<o.length&&o.charCodeAt(a.index)in n;)a.index+=1;const u=a.index;if(u>t){if(!h(e)&&!a.options.silent){const s=a.input.slice(t,u),c=d(e)?e(s,o,String(t)):e;h(c)||a.output.push(c);}a.indexMax=Math.max(a.indexMax,a.index);}return true}},nr=(r,e)=>{const n=r.source,a=r.flags.replace(/y|$/,\"y\"),t=new RegExp(n,a);return g(o=>{t.lastIndex=o.index;const u=t.exec(o.input);if(u){if(!h(e)&&!o.options.silent){const s=d(e)?e(...u,o.input,String(o.index)):e;h(s)||o.output.push(s);}return o.index+=u[0].length,o.indexMax=Math.max(o.indexMax,o.index),true}else return false})},ar=(r,e)=>n=>{if(n.input.startsWith(r,n.index)){if(!h(e)&&!n.options.silent){const t=d(e)?e(r,n.input,String(n.index)):e;h(t)||n.output.push(t);}return n.index+=r.length,n.indexMax=Math.max(n.indexMax,n.index),true}else return false},C=(r,e,n,a)=>{const t=v(r);return g(_(M(o=>{let u=0;for(;u<n;){const s=o.index;if(!t(o)||(u+=1,o.index===s))break}return u>=e})))},tr=(r,e)=>C(r,0,1),f=(r,e)=>C(r,0,1/0),x=(r,e)=>{const n=r.map(v);return g(_(M(a=>{for(let t=0,o=n.length;t<o;t++)if(!n[t](a))return false;return true})))},l=(r,e)=>{const n=r.map(v);return g(_(a=>{for(let t=0,o=n.length;t<o;t++)if(n[t](a))return true;return false}))},M=(r,e=false)=>{const n=v(r);return a=>{const t=a.index,o=a.output.length,u=n(a);return (!u||e)&&(a.index=t,a.output.length!==o&&(a.output.length=o)),u}},_=(r,e)=>{const n=v(r);return n},g=(()=>{let r=0;return e=>{const n=v(e),a=r+=1;return t=>{var o;if(t.options.memoization===false)return n(t);const u=t.index,s=(o=t.cache)[a]||(o[a]=new Map),c=s.get(u);if(c===false)return false;if(W(c))return t.index=c,true;if(c)return t.index=c.index,c.output?.length&&t.output.push(...c.output),true;{const Z=t.output.length;if(n(t)){const D=t.index,U=t.output.length;if(U>Z){const ee=t.output.slice(Z,U);s.set(u,{index:D,output:ee});}else s.set(u,D);return true}else return s.set(u,false),false}}}})(),E=r=>{let e;return n=>(e||(e=v(r())),e(n))},v=Y(r=>{if(d(r))return Q(r)?E(r):r;if(b(r)||X(r))return i(r);if(A(r))return x(r);if(K(r))return l(Object.values(r));throw new Error(\"Invalid rule\")}),P=\"abcdefghijklmnopqrstuvwxyz\",ir=r=>{let e=\"\";for(;r>0;){const n=(r-1)%26;e=P[n]+e,r=Math.floor((r-1)/26);}return e},O=r=>{let e=0;for(let n=0,a=r.length;n<a;n++)e=e*26+P.indexOf(r[n])+1;return e},S=(r,e)=>{if(e<r)return S(e,r);const n=[];for(;r<=e;)n.push(r++);return n},or=(r,e,n)=>S(r,e).map(a=>String(a).padStart(n,\"0\")),R=(r,e)=>S(O(r),O(e)).map(ir),p=r=>r,z=r=>ur(e=>rr(e,r,{memoization:false}).join(\"\")),ur=r=>{const e={};return n=>e[n]??(e[n]=r(n))},sr=i(/^\\*\\*\\/\\*$/,\".*\"),cr=i(/^\\*\\*\\/(\\*)?([ a-zA-Z0-9._-]+)$/,(r,e,n)=>`.*${e?\"\":\"(?:^|/)\"}${n.replaceAll(\".\",\"\\\\.\")}`),lr=i(/^\\*\\*\\/(\\*)?([ a-zA-Z0-9._-]*)\\{([ a-zA-Z0-9._-]+(?:,[ a-zA-Z0-9._-]+)*)\\}$/,(r,e,n,a)=>`.*${e?\"\":\"(?:^|/)\"}${n.replaceAll(\".\",\"\\\\.\")}(?:${a.replaceAll(\",\",\"|\").replaceAll(\".\",\"\\\\.\")})`),y=i(/\\\\./,p),pr=i(/[$.*+?^(){}[\\]\\|]/,r=>`\\\\${r}`),vr=i(/./,p),hr=i(/^(?:!!)*!(.*)$/,(r,e)=>`(?!^${L(e)}$).*?`),dr=i(/^(!!)+/,\"\"),fr=l([hr,dr]),xr=i(/\\/(\\*\\*\\/)+/,\"(?:/.+/|/)\"),gr=i(/^(\\*\\*\\/)+/,\"(?:^|.*/)\"),mr=i(/\\/(\\*\\*)$/,\"(?:/.*|$)\"),_r=i(/\\*\\*/,\".*\"),j=l([xr,gr,mr,_r]),Sr=i(/\\*\\/(?!\\*\\*\\/)/,\"[^/]*/\"),yr=i(/\\*/,\"[^/]*\"),N=l([Sr,yr]),k=i(\"?\",\"[^/]\"),$r=i(\"[\",p),wr=i(\"]\",p),Ar=i(/[!^]/,\"^/\"),br=i(/[a-z]-[a-z]|[0-9]-[0-9]/i,p),Cr=i(/[$.*+?^(){}[\\|]/,r=>`\\\\${r}`),Mr=i(/[^\\]]/,p),Er=l([y,Cr,br,Mr]),B=x([$r,tr(Ar),f(Er),wr]),Pr=i(\"{\",\"(?:\"),Or=i(\"}\",\")\"),Rr=i(/(\\d+)\\.\\.(\\d+)/,(r,e,n)=>or(+e,+n,Math.min(e.length,n.length)).join(\"|\")),zr=i(/([a-z]+)\\.\\.([a-z]+)/,(r,e,n)=>R(e,n).join(\"|\")),jr=i(/([A-Z]+)\\.\\.([A-Z]+)/,(r,e,n)=>R(e.toLowerCase(),n.toLowerCase()).join(\"|\").toUpperCase()),Nr=l([Rr,zr,jr]),I=x([Pr,Nr,Or]),kr=i(\"{\",\"(?:\"),Br=i(\"}\",\")\"),Ir=i(\",\",\"|\"),Fr=i(/[$.*+?^(){[\\]\\|]/,r=>`\\\\${r}`),Lr=i(/[^}]/,p),Zr=E(()=>F),Dr=l([j,N,k,B,I,Zr,y,Fr,Ir,Lr]),F=x([kr,f(Dr),Br]),Ur=f(l([sr,cr,lr,fr,j,N,k,B,I,F,y,pr,vr])),Vr=Ur,Gr=z(Vr),L=Gr,Tr=i(/\\\\./,p),qr=i(/./,p),Hr=i(/\\*\\*\\*+/,\"*\"),Jr=i(/([^/{[(!])\\*\\*/,(r,e)=>`${e}*`),Qr=i(/(^|.)\\*\\*(?=[^*/)\\]}])/,(r,e)=>`${e}*`),Wr=f(l([Tr,Hr,Jr,Qr,qr])),Kr=Wr,Xr=z(Kr),Yr=Xr,$=(r,e)=>{const n=Array.isArray(r)?r:[r];if(!n.length)return false;const a=n.map($.compile),t=n.every(s=>/(\\/(?:\\*\\*)?|\\[\\/\\])$/.test(s)),o=e.replace(/[\\\\\\/]+/g,\"/\").replace(/\\/$/,t?\"/\":\"\");return a.some(s=>s.test(o))};$.compile=r=>new RegExp(`^${L(Yr(r))}$`,\"s\");var re=$;return J(w)})();\n return __lib__.default || __lib__; };\nlet _match;\nconst zeptomatch = (path, pattern) => {\n if (!_match) {\n _match = _lazyMatch();\n _lazyMatch = null;\n }\n return _match(path, pattern);\n};\n\nconst _DRIVE_LETTER_START_RE = /^[A-Za-z]:\\//;\nfunction normalizeWindowsPath(input = \"\") {\n if (!input) {\n return input;\n }\n return input.replace(/\\\\/g, \"/\").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());\n}\n\nconst _UNC_REGEX = /^[/\\\\]{2}/;\nconst _IS_ABSOLUTE_RE = /^[/\\\\](?![/\\\\])|^[/\\\\]{2}(?!\\.)|^[A-Za-z]:[/\\\\]/;\nconst _DRIVE_LETTER_RE = /^[A-Za-z]:$/;\nconst _ROOT_FOLDER_RE = /^\\/([A-Za-z]:)?$/;\nconst _EXTNAME_RE = /.(\\.[^./]+|\\.)$/;\nconst _PATH_ROOT_RE = /^[/\\\\]|^[a-zA-Z]:[/\\\\]/;\nconst sep = \"/\";\nconst normalize = function(path) {\n if (path.length === 0) {\n return \".\";\n }\n path = normalizeWindowsPath(path);\n const isUNCPath = path.match(_UNC_REGEX);\n const isPathAbsolute = isAbsolute(path);\n const trailingSeparator = path[path.length - 1] === \"/\";\n path = normalizeString(path, !isPathAbsolute);\n if (path.length === 0) {\n if (isPathAbsolute) {\n return \"/\";\n }\n return trailingSeparator ? \"./\" : \".\";\n }\n if (trailingSeparator) {\n path += \"/\";\n }\n if (_DRIVE_LETTER_RE.test(path)) {\n path += \"/\";\n }\n if (isUNCPath) {\n if (!isPathAbsolute) {\n return `//./${path}`;\n }\n return `//${path}`;\n }\n return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;\n};\nconst join = function(...segments) {\n let path = \"\";\n for (const seg of segments) {\n if (!seg) {\n continue;\n }\n if (path.length > 0) {\n const pathTrailing = path[path.length - 1] === \"/\";\n const segLeading = seg[0] === \"/\";\n const both = pathTrailing && segLeading;\n if (both) {\n path += seg.slice(1);\n } else {\n path += pathTrailing || segLeading ? seg : `/${seg}`;\n }\n } else {\n path += seg;\n }\n }\n return normalize(path);\n};\nfunction cwd() {\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return process.cwd().replace(/\\\\/g, \"/\");\n }\n return \"/\";\n}\nconst resolve = function(...arguments_) {\n arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));\n let resolvedPath = \"\";\n let resolvedAbsolute = false;\n for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {\n const path = index >= 0 ? arguments_[index] : cwd();\n if (!path || path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = isAbsolute(path);\n }\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);\n if (resolvedAbsolute && !isAbsolute(resolvedPath)) {\n return `/${resolvedPath}`;\n }\n return resolvedPath.length > 0 ? resolvedPath : \".\";\n};\nfunction normalizeString(path, allowAboveRoot) {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let char = null;\n for (let index = 0; index <= path.length; ++index) {\n if (index < path.length) {\n char = path[index];\n } else if (char === \"/\") {\n break;\n } else {\n char = \"/\";\n }\n if (char === \"/\") {\n if (lastSlash === index - 1 || dots === 1) ; else if (dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== \".\" || res[res.length - 2] !== \".\") {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(\"/\");\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(\"/\");\n }\n lastSlash = index;\n dots = 0;\n continue;\n } else if (res.length > 0) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = index;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n res += res.length > 0 ? \"/..\" : \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) {\n res += `/${path.slice(lastSlash + 1, index)}`;\n } else {\n res = path.slice(lastSlash + 1, index);\n }\n lastSegmentLength = index - lastSlash - 1;\n }\n lastSlash = index;\n dots = 0;\n } else if (char === \".\" && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\nconst isAbsolute = function(p) {\n return _IS_ABSOLUTE_RE.test(p);\n};\nconst toNamespacedPath = function(p) {\n return normalizeWindowsPath(p);\n};\nconst extname = function(p) {\n if (p === \"..\") return \"\";\n const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));\n return match && match[1] || \"\";\n};\nconst relative = function(from, to) {\n const _from = resolve(from).replace(_ROOT_FOLDER_RE, \"$1\").split(\"/\");\n const _to = resolve(to).replace(_ROOT_FOLDER_RE, \"$1\").split(\"/\");\n if (_to[0][1] === \":\" && _from[0][1] === \":\" && _from[0] !== _to[0]) {\n return _to.join(\"/\");\n }\n const _fromCopy = [..._from];\n for (const segment of _fromCopy) {\n if (_to[0] !== segment) {\n break;\n }\n _from.shift();\n _to.shift();\n }\n return [..._from.map(() => \"..\"), ..._to].join(\"/\");\n};\nconst dirname = function(p) {\n const segments = normalizeWindowsPath(p).replace(/\\/$/, \"\").split(\"/\").slice(0, -1);\n if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) {\n segments[0] += \"/\";\n }\n return segments.join(\"/\") || (isAbsolute(p) ? \"/\" : \".\");\n};\nconst format = function(p) {\n const ext = p.ext ? p.ext.startsWith(\".\") ? p.ext : `.${p.ext}` : \"\";\n const segments = [p.root, p.dir, p.base ?? (p.name ?? \"\") + ext].filter(\n Boolean\n );\n return normalizeWindowsPath(\n p.root ? resolve(...segments) : segments.join(\"/\")\n );\n};\nconst basename = function(p, extension) {\n const segments = normalizeWindowsPath(p).split(\"/\");\n let lastSegment = \"\";\n for (let i = segments.length - 1; i >= 0; i--) {\n const val = segments[i];\n if (val) {\n lastSegment = val;\n break;\n }\n }\n return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;\n};\nconst parse = function(p) {\n const root = _PATH_ROOT_RE.exec(p)?.[0]?.replace(/\\\\/g, \"/\") || \"\";\n const base = basename(p);\n const extension = extname(base);\n return {\n root,\n dir: dirname(p),\n base,\n ext: extension,\n name: base.slice(0, base.length - extension.length)\n };\n};\nconst matchesGlob = (path, pattern) => {\n return zeptomatch(pattern, normalize(path));\n};\n\nconst _path = {\n __proto__: null,\n basename: basename,\n dirname: dirname,\n extname: extname,\n format: format,\n isAbsolute: isAbsolute,\n join: join,\n matchesGlob: matchesGlob,\n normalize: normalize,\n normalizeString: normalizeString,\n parse: parse,\n relative: relative,\n resolve: resolve,\n sep: sep,\n toNamespacedPath: toNamespacedPath\n};\n\nexport { _path as _, normalizeString as a, relative as b, basename as c, dirname as d, extname as e, format as f, normalizeWindowsPath as g, isAbsolute as i, join as j, matchesGlob as m, normalize as n, parse as p, resolve as r, sep as s, toNamespacedPath as t };\n","import { _ as _path } from './shared/pathe.M-eThtNZ.mjs';\nexport { c as basename, d as dirname, e as extname, f as format, i as isAbsolute, j as join, m as matchesGlob, n as normalize, a as normalizeString, p as parse, b as relative, r as resolve, s as sep, t as toNamespacedPath } from './shared/pathe.M-eThtNZ.mjs';\n\nconst delimiter = /* @__PURE__ */ (() => globalThis.process?.platform === \"win32\" ? \";\" : \":\")();\nconst _platforms = { posix: void 0, win32: void 0 };\nconst mix = (del = delimiter) => {\n return new Proxy(_path, {\n get(_, prop) {\n if (prop === \"delimiter\") return del;\n if (prop === \"posix\") return posix;\n if (prop === \"win32\") return win32;\n return _platforms[prop] || _path[prop];\n }\n });\n};\nconst posix = /* @__PURE__ */ mix(\":\");\nconst win32 = /* @__PURE__ */ mix(\";\");\n\nexport { posix as default, delimiter, posix, win32 };\n","import ErrorStackParser from 'error-stack-parser';\nimport path from 'pathe';\n\nvar LogLevel = /* @__PURE__ */ ((LogLevel2) => {\n LogLevel2[LogLevel2[\"Error\"] = 0] = \"Error\";\n LogLevel2[LogLevel2[\"Warning\"] = 1] = \"Warning\";\n LogLevel2[LogLevel2[\"Log\"] = 2] = \"Log\";\n LogLevel2[LogLevel2[\"Verbose\"] = 3] = \"Verbose\";\n LogLevel2[LogLevel2[\"Debug\"] = 4] = \"Debug\";\n return LogLevel2;\n})(LogLevel || {});\nvar LogLevelString = /* @__PURE__ */ ((LogLevelString2) => {\n LogLevelString2[\"Error\"] = \"error\";\n LogLevelString2[\"Warning\"] = \"warn\";\n LogLevelString2[\"Log\"] = \"log\";\n LogLevelString2[\"Verbose\"] = \"verbose\";\n LogLevelString2[\"Debug\"] = \"debug\";\n return LogLevelString2;\n})(LogLevelString || {});\nvar Format = /* @__PURE__ */ ((Format2) => {\n Format2[\"JSON\"] = \"json\";\n Format2[\"Pretty\"] = \"pretty\";\n return Format2;\n})(Format || {});\n\nconst isColorSupported = true;\nfunction formatter(open, close, replace = open) {\n return (input) => {\n const string = `${input}`;\n const index = string.indexOf(close, open.length);\n return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;\n };\n}\nfunction replaceClose(string, close, replace, index) {\n const start = string.substring(0, index) + replace;\n const end = string.substring(index + close.length);\n const nextIndex = end.indexOf(close);\n return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end;\n}\nfunction createColors(enabled = isColorSupported) {\n return {\n isColorSupported: enabled,\n reset: enabled ? (s) => `\\x1B[0m${s}\\x1B[0m` : String,\n bold: enabled ? formatter(\"\\x1B[1m\", \"\\x1B[22m\", \"\\x1B[22m\\x1B[1m\") : String,\n dim: enabled ? formatter(\"\\x1B[2m\", \"\\x1B[22m\", \"\\x1B[22m\\x1B[2m\") : String,\n italic: enabled ? formatter(\"\\x1B[3m\", \"\\x1B[23m\") : String,\n underline: enabled ? formatter(\"\\x1B[4m\", \"\\x1B[24m\") : String,\n inverse: enabled ? formatter(\"\\x1B[7m\", \"\\x1B[27m\") : String,\n hidden: enabled ? formatter(\"\\x1B[8m\", \"\\x1B[28m\") : String,\n strikethrough: enabled ? formatter(\"\\x1B[9m\", \"\\x1B[29m\") : String,\n black: enabled ? formatter(\"\\x1B[30m\", \"\\x1B[39m\") : String,\n red: enabled ? formatter(\"\\x1B[31m\", \"\\x1B[39m\") : String,\n green: enabled ? formatter(\"\\x1B[32m\", \"\\x1B[39m\") : String,\n yellow: enabled ? formatter(\"\\x1B[33m\", \"\\x1B[39m\") : String,\n blue: enabled ? formatter(\"\\x1B[34m\", \"\\x1B[39m\") : String,\n magenta: enabled ? formatter(\"\\x1B[35m\", \"\\x1B[39m\") : String,\n cyan: enabled ? formatter(\"\\x1B[36m\", \"\\x1B[39m\") : String,\n white: enabled ? formatter(\"\\x1B[37m\", \"\\x1B[39m\") : String,\n gray: enabled ? formatter(\"\\x1B[90m\", \"\\x1B[39m\") : String,\n bgBlack: enabled ? formatter(\"\\x1B[40m\", \"\\x1B[49m\") : String,\n bgRed: enabled ? formatter(\"\\x1B[41m\", \"\\x1B[49m\") : String,\n bgGreen: enabled ? formatter(\"\\x1B[42m\", \"\\x1B[49m\") : String,\n bgYellow: enabled ? formatter(\"\\x1B[43m\", \"\\x1B[49m\") : String,\n bgBlue: enabled ? formatter(\"\\x1B[44m\", \"\\x1B[49m\") : String,\n bgMagenta: enabled ? formatter(\"\\x1B[45m\", \"\\x1B[49m\") : String,\n bgCyan: enabled ? formatter(\"\\x1B[46m\", \"\\x1B[49m\") : String,\n bgWhite: enabled ? formatter(\"\\x1B[47m\", \"\\x1B[49m\") : String\n };\n}\nconst pc = createColors();\n\nconst logLevelStringToLogLevelMap = {\n [LogLevelString.Error]: LogLevel.Error,\n [LogLevelString.Warning]: LogLevel.Warning,\n [LogLevelString.Log]: LogLevel.Log,\n [LogLevelString.Verbose]: LogLevel.Verbose,\n [LogLevelString.Debug]: LogLevel.Debug\n};\nconst logLevelToLogLevelStringMap = {\n [LogLevel.Error]: LogLevelString.Error,\n [LogLevel.Warning]: LogLevelString.Warning,\n [LogLevel.Log]: LogLevelString.Log,\n [LogLevel.Verbose]: LogLevelString.Verbose,\n [LogLevel.Debug]: LogLevelString.Debug\n};\nconst availableLogLevelStrings = [\n LogLevelString.Error,\n LogLevelString.Warning,\n LogLevelString.Log,\n LogLevelString.Verbose,\n LogLevelString.Debug\n];\nconst logLevelToColorMap = {\n [LogLevel.Error]: pc.red,\n [LogLevel.Warning]: pc.yellow,\n [LogLevel.Log]: pc.blue,\n [LogLevel.Verbose]: pc.cyan,\n [LogLevel.Debug]: pc.green\n};\nconst availableLogLevels = [\n LogLevel.Error,\n LogLevel.Warning,\n LogLevel.Log,\n LogLevel.Verbose,\n LogLevel.Debug\n];\nconst availableFormats = [Format.JSON, Format.Pretty];\n\nfunction parseErrorStacks(errorLike) {\n if (errorLike.stack == null) {\n return [];\n }\n return errorLike.stack.split(\"\\n\").map((item) => item.trim()).slice(1).filter((item) => {\n const match = /^at (.*)( \\(.*:(\\d+):(\\d+)\\))|at (.*)(:(\\d+):(\\d+))/i.exec(item);\n if (!match)\n return false;\n return true;\n }).map((item) => {\n const match = /at (.*)( \\((.*):(\\d+):(\\d+)\\))|at (.*)(:(\\d+):(\\d+))/i.exec(item);\n if (!match) {\n return {\n invalid: true\n };\n }\n if (typeof match[1] !== \"undefined\" && typeof match[2] !== \"undefined\" && typeof match[3] !== \"undefined\" && typeof match[4] !== \"undefined\" && typeof match[5] !== \"undefined\") {\n return {\n invalid: false,\n function: match[1] ?? \"\",\n file: match[3] ?? \"\",\n line: Number.parseInt(match[4] ?? \"0\"),\n column: Number.parseInt(match[5] ?? \"0\")\n };\n } else if (typeof match[6] !== \"undefined\" && typeof match[7] !== \"undefined\" && typeof match[8] !== \"undefined\" && typeof match[9] !== \"undefined\") {\n return {\n invalid: false,\n function: match[6] ?? \"\",\n file: match[7] ?? \"\",\n line: Number.parseInt(match[8] ?? \"0\"),\n column: Number.parseInt(match[9] ?? \"0\")\n };\n } else {\n return {\n invalid: true\n };\n }\n });\n}\n\nfunction isErrorLike(err) {\n if (err == null) {\n return false;\n }\n if (err instanceof Error) {\n return true;\n }\n return false;\n}\nfunction newLog(logLevel, context, fields, message, timeFormatter) {\n let fieldsObj = { context: \"\" };\n if (typeof fields !== \"undefined\" && fields !== null) {\n fieldsObj = { ...fields };\n }\n if (typeof context !== \"undefined\" && context !== null) {\n fieldsObj.context = context;\n }\n const now = /* @__PURE__ */ new Date();\n const raw = {\n \"@timestamp\": now.getTime(),\n \"@localetime\": timeFormatter ? timeFormatter(now) : now.toISOString(),\n \"level\": logLevel,\n \"fields\": fieldsObj,\n \"message\": message\n };\n return raw;\n}\nfunction newErrorLog(logLevel, context, fields, message, errorStack, timeFormatter) {\n const log = newLog(logLevel, context, fields, message, timeFormatter);\n if (typeof errorStack !== \"undefined\" && errorStack !== null) {\n log.errored = true;\n log.error = { stack: errorStack };\n }\n return log;\n}\nfunction prettyFormatValue(value) {\n let valueString = \"\";\n switch (typeof value) {\n case \"number\":\n valueString = pc.yellow(value);\n break;\n case \"object\":\n valueString = pc.green(JSON.stringify(value));\n break;\n case \"boolean\":\n valueString = pc.yellow(String(value));\n break;\n case \"undefined\":\n valueString = pc.gray(\"undefined\");\n break;\n default:\n valueString = String(value);\n break;\n }\n return valueString;\n}\nfunction toPrettyString(log) {\n const messagePartials = [];\n messagePartials.push(log[\"@localetime\"]);\n messagePartials.push(\n logLevelToColorMap[logLevelStringToLogLevelMap[log.level]](\n `[${log.level}]`\n )\n );\n let contextString = \"\";\n if (log.fields.isNestSystemModule != null) {\n contextString = pc.magenta(`[${log.fields.nestSystemModule}]`);\n delete log.fields.isNestSystemModule;\n delete log.fields.nestSystemModule;\n }\n if (log.fields.context != null) {\n contextString = pc.magenta(`[${log.fields.context}]`);\n delete log.fields.context;\n }\n if (contextString.length > 0) {\n messagePartials.push(contextString);\n }\n if (\"module\" in log.fields && log.fields.module != null) {\n messagePartials.push(pc.magenta(`[${log.fields.module}]`));\n delete log.fields.module;\n }\n messagePartials.push(log.message);\n const fieldsEntries = Object.entries(log.fields);\n if (fieldsEntries.length > 0) {\n messagePartials.push(\" {\");\n }\n for (const [key, value] of fieldsEntries) {\n let valueString = value;\n if (isErrorLike(value)) {\n if (value.message) {\n valueString = prettyFormatValue(value.message);\n }\n if (!valueString) {\n valueString = \"\";\n }\n if (value.cause != null) {\n try {\n valueString += JSON.stringify(value.cause);\n } catch {\n valueString += String(value.cause);\n }\n }\n } else {\n valueString = prettyFormatValue(value);\n }\n messagePartials.push(`${pc.gray(key)}${pc.gray(\"=\")}${valueString}`);\n }\n if (fieldsEntries.length > 0) {\n messagePartials.push(\"}\");\n }\n let message = messagePartials.join(\" \");\n if (log.errored != null && log.errored && log.error && log.error.stack != null && log.error.stack) {\n message += `\n${log.error.stack}`;\n }\n return message;\n}\nfunction shouldOutputDebugLevelLogWhenLogLevelIsOneOf(logLevel) {\n return logLevel >= LogLevel.Debug;\n}\nfunction shouldOutputVerboseLevelLogWhenLogLevelIsOneOf(logLevel) {\n return logLevel >= LogLevel.Verbose;\n}\nfunction shouldOutputLogLevelLogWhenLogLevelIsOneOf(logLevel) {\n return logLevel >= LogLevel.Log;\n}\nfunction shouldOutputWarningLevelLogWhenLogLevelIsOneOf(logLevel) {\n return logLevel >= LogLevel.Warning;\n}\nfunction shouldOutputErrorLevelLogWhenLogLevelIsOneOf(logLevel) {\n return logLevel >= LogLevel.Error;\n}\n\nfunction isBrowser() {\n return typeof window !== \"undefined\";\n}\n\nfunction shouldUseHyperlink() {\n return !isBrowser() && getGlobalFormat() === Format.Pretty;\n}\nfunction withHyperlink(basePath, context) {\n return shouldUseHyperlink() ? `\\x1B]8;;file://${basePath}\\x1B\\\\${context}\\x1B]8;;\\x1B\\\\` : context;\n}\n\nconst GLOBAL_CONFIG = {\n configured: false,\n logLevel: LogLevel.Debug,\n format: Format.JSON,\n timeFormatter: (inputDate) => inputDate.toISOString()\n};\nfunction getGlobalLogLevel() {\n return GLOBAL_CONFIG.logLevel;\n}\nfunction setGlobalLogLevel(logLevel) {\n if (availableLogLevels.includes(logLevel)) {\n GLOBAL_CONFIG.logLevel = logLevel;\n } else {\n throw new Error(\n `log level ${logLevel} is not available. available log levels are: ${availableLogLevels.join(\n \", \"\n )}`\n );\n }\n GLOBAL_CONFIG.configured = true;\n}\nfunction getGlobalLogLevelString() {\n return logLevelToLogLevelStringMap[GLOBAL_CONFIG.logLevel];\n}\nfunction setGlobalLogLevelString(logLevelString) {\n if (availableLogLevelStrings.includes(logLevelString)) {\n GLOBAL_CONFIG.logLevel = logLevelStringToLogLevelMap[logLevelString];\n } else {\n throw new Error(\n `log level ${logLevelString} is not available. available log levels are: ${availableLogLevelStrings.join(\n \", \"\n )}`\n );\n }\n GLOBAL_CONFIG.configured = true;\n}\nfunction getGlobalFormat() {\n return GLOBAL_CONFIG.format;\n}\nfunction setGlobalFormat(format) {\n if (availableFormats.includes(format)) {\n GLOBAL_CONFIG.format = format;\n } else {\n throw new Error(\n `format ${format} is not available. available formats are: ${availableFormats.join(\n \", \"\n )}`\n );\n }\n GLOBAL_CONFIG.configured = true;\n}\nfunction setGlobalTimeFormatter(fn) {\n GLOBAL_CONFIG.timeFormatter = fn;\n GLOBAL_CONFIG.configured = true;\n}\nfunction getGlobalTimeFormatter() {\n return GLOBAL_CONFIG.timeFormatter;\n}\nfunction createLogg(context) {\n const logObj = {\n fields: {},\n context,\n logLevel: LogLevel.Debug,\n format: Format.JSON,\n shouldUseGlobalConfig: false,\n errorProcessor: (err) => err,\n timeFormatter: (inputDate) => inputDate.toISOString(),\n useGlobalConfig: () => {\n logObj.shouldUseGlobalConfig = true;\n logObj.format = getGlobalFormat();\n logObj.logLevel = getGlobalLogLevel();\n return logObj.child();\n },\n child: (fields) => {\n const logger = createLogg(logObj.context);\n if (fields != null) {\n logger.fields = { ...logObj.fields, ...fields };\n } else {\n logger.fields = logObj.fields;\n }\n if (logger.fields != null && \"context\" in logger.fields) {\n logger.context = logger.fields.context;\n } else {\n logger.context = logObj.context;\n }\n logger.logLevel = logObj.logLevel;\n logger.format = logObj.format;\n logger.shouldUseGlobalConfig = logObj.shouldUseGlobalConfig;\n return logger;\n },\n withContext: (context2) => {\n const logger = logObj.child();\n logger.context = context2;\n return logger;\n },\n withLogLevel: (logLevel) => {\n const logger = logObj.child();\n if (availableLogLevels.includes(logLevel)) {\n logger.logLevel = logLevel;\n logger.shouldUseGlobalConfig = false;\n logger.debug(\n `setting log level to ${logLevelToLogLevelStringMap[logLevel]} (${logLevel})`\n );\n } else {\n throw new Error(\n `log level ${logLevel} is not available. available log levels are: ${availableLogLevels.join(\n \", \"\n )}`\n );\n }\n return logger;\n },\n withLogLevelString: (logLevelString) => {\n const logger = logObj.child();\n if (availableLogLevelStrings.includes(logLevelString)) {\n logger.logLevel = logLevelStringToLogLevelMap[logLevelString];\n logger.shouldUseGlobalConfig = false;\n logger.debug(\n `setting log level to ${logLevelString} (${logLevelStringToLogLevelMap[logLevelString]})`\n );\n } else {\n throw new Error(\n `log level ${logLevelString} is not available. available log levels are: ${availableLogLevelStrings.join(\n \", \"\n )}`\n );\n }\n return logger;\n },\n withFormat: (format) => {\n const logger = logObj.child();\n if (availableFormats.includes(format)) {\n logger.format = format;\n logger.shouldUseGlobalConfig = false;\n logger.debug(`setting format to ${format}`);\n } else {\n throw new Error(\n `format ${format} is not available. available formats are: ${availableFormats.join(\n \", \"\n )}`\n );\n }\n return logger;\n },\n withFields: (fields) => {\n if (typeof fields === \"undefined\" || fields === null) {\n return logObj.child({});\n }\n return logObj.child(fields);\n },\n withField(key, value) {\n if (typeof key === \"undefined\" || key === null) {\n throw new Error(\"key is required\");\n }\n return logObj.child({ [key]: value });\n },\n withError: (err) => {\n err = logObj.errorProcessor(err);\n if (!isErrorLike(err)) {\n return logObj.withField(\"error\", String(err));\n }\n let logger = logObj;\n logger = logger.withField(\"error\", err.message);\n if (err.stack != null) {\n logger = logger.withField(\"stack\", err.stack);\n }\n if (err.cause != null) {\n try {\n logger = logger.withField(\"cause\", JSON.stringify(err.cause));\n } catch {\n logger = logger.withField(\"cause\", String(err.cause));\n }\n }\n return logger;\n },\n withCallStack(errorLike) {\n const stacks = parseErrorStacks(errorLike).slice(2).filter((item) => !item.invalid);\n if (stacks.length === 0) {\n return logObj;\n }\n return logObj.child({\n function: stacks[0].function,\n file: `${stacks[0].file}:${stacks[0].line}:${stacks[0].column}`,\n line: stacks[0].line,\n column: stacks[0].column\n });\n },\n // Placeholder implementations, will be overridden below\n debug: () => {\n },\n verbose: () => {\n },\n log: () => {\n },\n error: () => {\n },\n errorWithError: () => {\n },\n warn: () => {\n },\n // TODO: remove in next major release\n withTimeFormat: (_) => {\n const logger = logObj.child();\n return logger;\n },\n withTimeFormatter: (fn) => {\n const logger = logObj.child();\n logger.timeFormatter = fn;\n return logger;\n },\n withErrorProcessor: (fn) => {\n const logger = logObj.child();\n logger.errorProcessor = fn;\n return logger;\n }\n };\n const getEffectiveLogLevel = () => {\n return logObj.shouldUseGlobalConfig ? getGlobalLogLevel() : logObj.logLevel;\n };\n const getEffectiveFormat = () => {\n return logObj.shouldUseGlobalConfig ? getGlobalFormat() : logObj.format;\n };\n const getEffectiveTimeFormatter = () => {\n return logObj.shouldUseGlobalConfig ? getGlobalTimeFormatter() : logObj.timeFormatter ?? ((inputDate) => inputDate.toISOString());\n };\n const mergeOptionalParams = (optionalParams) => {\n if (optionalParams != null && optionalParams.length > 0) {\n if (Object.keys(logObj.fields).length > 0) {\n return [logObj.fields, ...optionalParams];\n } else {\n return optionalParams;\n }\n }\n return logObj.fields;\n };\n const outputToConsole = (raw, consoleMethod, mergedFields) => {\n const format = getEffectiveFormat();\n if (isBrowser() && format === Format.Pretty) {\n raw.fields = Object.fromEntries(\n Object.entries(raw.fields).filter(([key, value]) => {\n if (key === \"isNestSystemModule\" || key === \"nestSystemModule\" || key === \"context\") {\n return [key, value];\n }\n return void 0;\n })\n );\n const fieldsToOutput = mergedFields ?? logObj.fields;\n if (Array.isArray(fieldsToOutput) && fieldsToOutput.length > 0) {\n console[consoleMethod](toPrettyString(raw), ...fieldsToOutput);\n } else if (Object.keys(fieldsToOutput).length > 0) {\n console[consoleMethod](toPrettyString(raw), fieldsToOutput);\n } else {\n console[consoleMethod](toPrettyString(raw));\n }\n return;\n }\n const output = format === Format.Pretty ? toPrettyString(raw) : JSON.stringify(raw);\n console[consoleMethod](output);\n };\n const logLevelCheckMap = {\n [LogLevelString.Debug]: shouldOutputDebugLevelLogWhenLogLevelIsOneOf,\n [LogLevelString.Verbose]: shouldOutputVerboseLevelLogWhenLogLevelIsOneOf,\n [LogLevelString.Log]: shouldOutputLogLevelLogWhenLogLevelIsOneOf,\n [LogLevelString.Warning]: shouldOutputWarningLevelLogWhenLogLevelIsOneOf\n };\n const consoleMethodMap = {\n [LogLevelString.Debug]: \"debug\",\n [LogLevelString.Verbose]: \"log\",\n [LogLevelString.Log]: \"log\",\n [LogLevelString.Warning]: \"warn\"\n };\n const logWithLevel = (levelString, message, optionalParams) => {\n const logLevel = getEffectiveLogLevel();\n const shouldOutput = logLevelCheckMap[levelString];\n if (!shouldOutput(logLevel)) {\n return;\n }\n const mergedFields = mergeOptionalParams(optionalParams);\n const raw = newLog(\n levelString,\n logObj.context,\n mergedFields,\n message,\n getEffectiveTimeFormatter()\n );\n outputToConsole(raw, consoleMethodMap[levelString], mergedFields);\n };\n logObj.debug = (message, ...optionalParams) => {\n logWithLevel(LogLevelString.Debug, message, optionalParams);\n };\n logObj.verbose = (message, ...optionalParams) => {\n logWithLevel(LogLevelString.Verbose, message, optionalParams);\n };\n logObj.log = (message, ...optionalParams) => {\n logWithLevel(LogLevelString.Log, message, optionalParams);\n };\n logObj.warn = (message, ...optionalParams) => {\n logWithLevel(LogLevelString.Warning, message, optionalParams);\n };\n logObj.error = (message, stack, ...optionalParams) => {\n const logLevel = getEffectiveLogLevel();\n if (!shouldOutputErrorLevelLogWhenLogLevelIsOneOf(logLevel)) {\n return;\n }\n const mergedFields = mergeOptionalParams(optionalParams);\n const raw = newErrorLog(\n LogLevelString.Error,\n logObj.context,\n mergedFields,\n message,\n stack,\n getEffectiveTimeFormatter()\n );\n outputToConsole(raw, \"error\", mergedFields);\n };\n logObj.errorWithError = (message, err, ...optionalParams) => {\n return logObj.withError(err).error(message, void 0, ...optionalParams);\n };\n return logObj;\n}\nconst useLogg = createLogg;\nfunction createLogger(context) {\n const stack = ErrorStackParser.parse(new Error());\n const currentStack = stack[1];\n const basePath = currentStack.fileName?.replace(\"async\", \"\").trim() ?? \"\";\n const fileName = path.join(...basePath.split(path.sep).slice(-2));\n context = context ?? `${fileName}:${currentStack.lineNumber}`;\n return createLogg(withHyperlink(basePath, context));\n}\nconst useLogger = (context) => createLogger(context).useGlobalConfig();\nconst useGlobalLogger = useLogger;\nfunction initLogger(level = LogLevel.Verbose, format = Format.Pretty) {\n setGlobalLogLevel(level);\n setGlobalFormat(format);\n const logger = useLogg(\"logger\").useGlobalConfig();\n logger.withFields({ level: LogLevel[level], format }).log(\"Logger initialized\");\n}\n\nexport { Format, LogLevel, LogLevelString, Format as LoggerFormat, LogLevel as LoggerLevel, availableFormats, availableLogLevelStrings, availableLogLevels, createLogg, createLogger, getGlobalFormat, getGlobalLogLevel, getGlobalLogLevelString, getGlobalTimeFormatter, initLogger, logLevelStringToLogLevelMap, logLevelToColorMap, logLevelToLogLevelStringMap, setGlobalFormat, setGlobalLogLevel, setGlobalLogLevelString, setGlobalTimeFormatter, useGlobalLogger, useLogg, useLogger };\n","/**\n * 腾讯云 CLS 日志上报工具(浏览器版本)\n * \n * 统一使用腾讯云 CLS 进行埋点上报,对齐 Spatial-Walk 标准\n * 使用 CLS HTTP API 进行日志上传,适用于浏览器环境\n */\n\nimport { CLS_TRACK_EVENTS, getCLSConfig } from '../config/constants'\nimport { Environment } from '../types'\nimport { logger } from './logger'\n\n// 日志缓冲区,批量发送\nlet logBuffer: Array<{\n time: number\n contents: Array<{ key: string, value: string }>\n}> = []\n\nlet flushTimer: number | null = null\nconst FLUSH_INTERVAL = 2000 // 2秒刷新一次\nconst MAX_BUFFER_SIZE = 100 // 最大缓冲区大小\nlet currentEnvironment: Environment | null = null\nlet clsConfig: ReturnType<typeof getCLSConfig> | null = null\n\n/**\n * 初始化 CLS(需要传入环境信息)\n */\nexport function initializeCLS(environment: Environment): void {\n if (!CLS_TRACK_EVENTS) {\n return\n }\n\n currentEnvironment = environment\n clsConfig = getCLSConfig(environment)\n\n // 验证配置:必须要有 endpoint 和 topicId\n // 认证方式:可以使用 token 或 secretId/secretKey\n if (!clsConfig.endpoint || !clsConfig.topicId) {\n logger.warn('[CLS] Configuration incomplete (missing endpoint or topicId), tracking disabled')\n return\n }\n\n // 验证认证方式:至少要有一种认证方式\n const hasToken = !!clsConfig.token\n const hasSecret = !!clsConfig.secretId && !!clsConfig.secretKey\n \n if (!hasToken && !hasSecret) {\n logger.warn('[CLS] Configuration incomplete (missing authentication: token or secretId/secretKey), tracking disabled')\n return\n }\n\n logger.log(`[CLS] Initialized successfully (browser mode) - environment: ${environment}, endpoint: ${clsConfig.endpoint}, topicId: ${clsConfig.topicId}, authMethod: ${hasToken ? 'token' : 'secret'}`)\n \n // 启动定时刷新\n startFlushTimer()\n}\n\n/**\n * 启动定时刷新缓冲区\n */\nfunction startFlushTimer(): void {\n if (flushTimer !== null) {\n return\n }\n\n flushTimer = window.setInterval(() => {\n if (logBuffer.length > 0) {\n flushLogs()\n }\n }, FLUSH_INTERVAL)\n}\n\n/**\n * 停止定时刷新\n */\nfunction stopFlushTimer(): void {\n if (flushTimer !== null) {\n clearInterval(flushTimer)\n flushTimer = null\n }\n}\n\n/**\n * 刷新日志缓冲区,发送到 CLS\n */\nasync function flushLogs(): Promise<void> {\n if (logBuffer.length === 0) {\n return\n }\n\n const logsToSend = [...logBuffer]\n logBuffer = []\n\n try {\n await uploadLogsToCLS(logsToSend)\n }\n catch (error) {\n logger.warn('[CLS] Failed to flush logs:', error instanceof Error ? error.message : String(error))\n // 失败后重新加入缓冲区(避免丢失)\n logBuffer.unshift(...logsToSend)\n // 限制缓冲区大小\n if (logBuffer.length > MAX_BUFFER_SIZE) {\n logBuffer = logBuffer.slice(0, MAX_BUFFER_SIZE)\n }\n }\n}\n\n/**\n * 注意:如果使用 secretId/secretKey 认证,需要实现腾讯云 TC3-HMAC-SHA256 签名算法\n * 由于 Web Crypto API 是异步的,而签名计算需要同步,建议:\n * 1. 使用 token 认证(推荐,简单安全)\n * 2. 通过后端代理进行签名(如果必须使用 secretId/secretKey)\n * 3. 引入 crypto-js 等库实现同步签名算法\n */\n\n/**\n * 上传日志到 CLS(使用 HTTP API)\n */\nasync function uploadLogsToCLS(logs: Array<{ time: number, contents: Array<{ key: string, value: string }> }>): Promise<void> {\n if (!CLS_TRACK_EVENTS || !clsConfig || !clsConfig.endpoint || !clsConfig.topicId) {\n return\n }\n\n // 构建请求 URL(对齐 iOS 端使用的 TencentCloudLogProducer SDK)\n // 腾讯云 CLS HTTP API 格式:https://{endpoint}/structuredlog?topic_id={topicId}\n const url = `https://${clsConfig.endpoint}/structuredlog?topic_id=${clsConfig.topicId}`\n\n // 构建请求体\n const requestBody = {\n logs,\n }\n const payload = JSON.stringify(requestBody)\n\n // 构建请求头\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // 认证方式:优先使用 token,否则使用 secretId/secretKey 签名\n if (clsConfig.token) {\n // 使用 token 认证(简单方式)\n headers['Authorization'] = `Bearer ${clsConfig.token}`\n } else if (clsConfig.secretId && clsConfig.secretKey) {\n // 使用 secretId/secretKey 签名(需要实现完整的腾讯云签名算法)\n // 注意:在浏览器中直接使用 secretKey 不安全,建议通过后端代理\n // 这里暂时不实现签名算法,因为需要引入 crypto-js 等库\n // 如果需要在浏览器中使用 secretId/secretKey,建议通过后端代理\n logger.warn('[CLS] SecretId/SecretKey authentication requires signature algorithm, which is not implemented in browser. Please use token authentication or proxy through backend.')\n return\n } else {\n logger.warn('[CLS] No authentication method available')\n return\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: payload,\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n throw new Error(`CLS API error: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ''}`)\n }\n }\n catch (error) {\n throw error\n }\n}\n\n/**\n * 上报日志到 CLS\n * @param event 事件名称\n * @param level 日志级别\n * @param contents 日志内容\n */\nexport function trackEvent(\n event: string,\n level: 'debug' | 'info' | 'warning' | 'error' = 'info',\n contents: Record<string, unknown> = {},\n): void {\n if (!CLS_TRACK_EVENTS) {\n return\n }\n\n try {\n // 构建日志内容\n const logContents: Array<{ key: string, value: string }> = [\n { key: 'event', value: event },\n { key: 'level', value: level },\n { key: 'timestamp', value: Date.now().toString() },\n ]\n\n // 添加其他内容\n for (const [key, value] of Object.entries(contents)) {\n logContents.push({\n key,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n })\n }\n\n // 添加到缓冲区\n logBuffer.push({\n time: Math.floor(Date.now() / 1000),\n contents: logContents,\n })\n\n // 如果缓冲区满了,立即刷新\n if (logBuffer.length >= MAX_BUFFER_SIZE) {\n flushLogs()\n }\n }\n catch (error) {\n logger.warn('[CLS] Failed to track event:', error instanceof Error ? error.message : String(error))\n }\n}\n\n/**\n * 清理 CLS(刷新剩余日志并停止定时器)\n */\nexport function cleanupCLS(): void {\n stopFlushTimer()\n \n // 刷新剩余日志\n if (logBuffer.length > 0) {\n flushLogs()\n }\n\n logger.log('[CLS] Cleaned up')\n}\n","/**\n * Logger Utility\n * Environment-aware logger wrapper\n * - Logs normally in test/dev environment\n * - In production: silently logs to console\n * - Errors and warnings are always reported to CLS (when enabled)\n *\n * Usage: Replace `console.log()` with `logger.log()`\n */\n\nimport { useLogger } from '@guiiai/logg'\nimport { trackEvent } from './cls-tracker'\n\nexport const logger = useLogger('Web')\n .withErrorProcessor((err: Error | unknown) => {\n captureErrorContext('error', err)\n return err\n })\n .useGlobalConfig()\n\n// 扩展 logger 类型以支持 unknown 参数\nexport const loggerWithUnknown = {\n ...logger,\n error: (message: string, error?: unknown) => {\n if (error !== undefined) {\n logger.error(`${message}: ${error instanceof Error ? error.message : String(error)}`)\n captureErrorContext('error', error)\n }\n else {\n logger.error(message)\n }\n },\n warn: (message: string, error?: unknown) => {\n if (error !== undefined) {\n logger.warn(`${message}: ${error instanceof Error ? error.message : String(error)}`)\n captureErrorContext('warning', error)\n }\n else {\n logger.warn(message)\n }\n },\n}\n\n/**\n * Capture error context for CLS\n */\nfunction captureErrorContext(level: 'error' | 'warning', error: unknown): void {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n trackEvent('logger_error', level, {\n error: errorMessage,\n stack: errorStack,\n timestamp: Date.now(),\n environment: import.meta.env.MODE || 'production',\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n })\n}\n","/**\n * SDK 配置加载器\n * 从远程配置接口获取 SDK 端点配置\n */\n\nimport type { SdkConfigResponse } from '../types'\n\nimport { Environment } from '../types'\nimport { logger } from '../utils/logger'\n\ninterface SdkConfigCache {\n config: Partial<Record<Environment, string>> | null\n promise: Promise<void> | null\n}\n\n// 全局缓存,避免重复请求\nconst configCache: SdkConfigCache = {\n config: null,\n promise: null,\n}\n\n/**\n * 从远程配置接口获取 SDK 配置\n * @param version SDK 版本号\n * @returns 解析后的配置映射\n */\nexport async function fetchSdkConfig(version: string): Promise<Partial<Record<Environment, string>>> {\n // 如果已经在获取中,等待之前的请求完成\n if (configCache.promise) {\n await configCache.promise\n return configCache.config || {}\n }\n\n // 如果已经有缓存,直接返回\n if (configCache.config) {\n return configCache.config\n }\n\n // 创建新的请求\n configCache.promise = (async () => {\n try {\n // 开发环境使用代理,生产环境直接请求\n const isDev = typeof window !== 'undefined' && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')\n const configUrl = isDev\n ? `/api/config/sdk?version=${version}`\n : `https://config.spatialwalk.top/sdk?version=${version}`\n logger.log(`[SdkConfigLoader] Fetching SDK config from: ${configUrl}`)\n\n const response = await fetch(configUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`)\n }\n\n const data = await response.json() as SdkConfigResponse\n\n if (!data.endpoints) {\n throw new Error('Invalid config response: missing endpoints')\n }\n\n // 解析并存储配置\n const config: Partial<Record<Environment, string>> = {}\n if (data.endpoints.cn) {\n config[Environment.cn] = `https://${data.endpoints.cn}`\n }\n if (data.endpoints.us) {\n config[Environment.us] = `https://${data.endpoints.us}`\n }\n if (data.endpoints.test) {\n config[Environment.test] = `https://${data.endpoints.test}`\n }\n\n configCache.config = config\n logger.log(`[SdkConfigLoader] SDK config fetched successfully:`, config)\n }\n catch (error) {\n logger.warn('[SdkConfigLoader] Failed to fetch SDK config:', error instanceof Error ? error.message : String(error))\n // 不抛出错误,返回空对象,让调用方使用默认配置\n configCache.config = {}\n }\n finally {\n configCache.promise = null\n }\n })()\n\n await configCache.promise\n return configCache.config || {}\n}\n\n/**\n * 清除配置缓存(用于测试或重新加载)\n */\nexport function clearSdkConfigCache(): void {\n configCache.config = null\n configCache.promise = null\n}\n","/* eslint-disable style/max-statements-per-line */\n\n/**\n * Avatar Core WASM 内存管理工具\n *\n * 提供高效的内存分配、数据传递和零拷贝访问功能\n * 专门为 avatar_core_wasm 优化\n */\n\n// WASM 模块接口定义\ninterface WASMModule {\n _malloc: (size: number) => number\n _free: (ptr: number) => void\n writeArrayToMemory: (array: Uint8Array, ptr: number) => void\n HEAPU8: Uint8Array\n HEAP32: Int32Array\n HEAPF32: Float32Array\n getValue: (ptr: number, type: string) => number\n setValue: (ptr: number, value: number, type: string) => void\n}\n\n// 内存分配结果\ninterface MemoryAllocation {\n ptr: number\n size: number\n}\n\n// 模板资源接口\nexport interface TemplateResources {\n flameModel: ArrayBuffer\n flameTemplate: ArrayBuffer\n teethPb: ArrayBuffer\n teethNpz: ArrayBuffer\n}\n\n// 角色数据接口(预留)\nexport interface CharacterData {\n shape: ArrayBuffer\n pointCloud: ArrayBuffer\n}\n\n// 表情参数接口(预留)\nexport interface ExpressionParams {\n expression?: number[]\n jaw?: number[]\n eyeR?: number[]\n eyeL?: number[]\n pose?: number[]\n neck?: number[]\n translation?: number[]\n}\n\n// 数组元数据(预留)\nexport interface ArrayMetadata {\n ptr: number\n size: number\n dtype: string\n}\n\nexport class AvatarCoreMemoryManager {\n private module: WASMModule\n private allocatedPointers: Set<number>\n private structPointers: Map<string, number>\n\n constructor(wasmModule: WASMModule) {\n this.module = wasmModule\n this.allocatedPointers = new Set() // 跟踪所有分配的指针\n this.structPointers = new Map() // 跟踪结构体指针\n }\n\n /**\n * 分配 WASM 内存并复制数据 - 纯 API 方式\n */\n allocateAndCopy(arrayBuffer: ArrayBuffer): MemoryAllocation {\n const size = arrayBuffer.byteLength\n const ptr = this.module._malloc(size)\n\n if (!ptr) {\n throw new Error(`Failed to allocate ${size} bytes in WASM memory`)\n }\n\n const uint8Array = new Uint8Array(arrayBuffer)\n\n // 使用 writeArrayToMemory 进行数据写入\n this.module.writeArrayToMemory(uint8Array, ptr)\n\n this.allocatedPointers.add(ptr)\n return { ptr, size }\n }\n\n /**\n * 创建 AvatarTemplateConfig 结构体\n */\n createTemplateConfig(resources: TemplateResources): number {\n const structSize = 10 * 4\n const configPtr = this.module._malloc(structSize)\n\n if (!configPtr) {\n throw new Error('Failed to allocate AvatarTemplateConfig structure')\n }\n\n // 验证必需资源\n if (!resources.flameModel || resources.flameModel.byteLength === 0) {\n throw new Error('flameModel is missing or empty!')\n }\n if (!resources.flameTemplate || resources.flameTemplate.byteLength === 0) {\n throw new Error('flameTemplate is missing or empty!')\n }\n if (!resources.teethPb || resources.teethPb.byteLength === 0) {\n throw new Error('teethPb is missing or empty!')\n }\n if (!resources.teethNpz || resources.teethNpz.byteLength === 0) {\n throw new Error('teethNpz is missing or empty!')\n }\n\n // 分配并复制所有资源数据\n const flameModel = this.allocateAndCopy(resources.flameModel)\n const flameTemplate = this.allocateAndCopy(resources.flameTemplate)\n const teethPb = this.allocateAndCopy(resources.teethPb)\n const teethNpz = this.allocateAndCopy(resources.teethNpz)\n\n let offset = 0\n\n // flame_model_data, flame_model_size\n this.module.setValue(configPtr + offset, flameModel.ptr, 'i32'); offset += 4\n this.module.setValue(configPtr + offset, flameModel.size, 'i32'); offset += 4\n\n // flame_template_data, flame_template_size\n this.module.setValue(configPtr + offset, flameTemplate.ptr, 'i32'); offset += 4\n this.module.setValue(configPtr + offset, flameTemplate.size, 'i32'); offset += 4\n\n // teeth_pb_data, teeth_pb_size\n this.module.setValue(configPtr + offset, teethPb.ptr, 'i32'); offset += 4\n this.module.setValue(configPtr + offset, teethPb.size, 'i32'); offset += 4\n\n // teeth_npz_data, teeth_npz_size\n this.module.setValue(configPtr + offset, teethNpz.ptr, 'i32'); offset += 4\n this.module.setValue(configPtr + offset, teethNpz.size, 'i32'); offset += 4\n\n // teeth_mask_npz_data, teeth_mask_npz_size (可选)\n this.module.setValue(configPtr + offset, 0, 'i32'); offset += 4\n this.module.setValue(configPtr + offset, 0, 'i32'); offset += 4\n\n this.structPointers.set('template_config', configPtr)\n return configPtr\n }\n\n /**\n * 创建 AvatarCharacterData 结构体 - 新版 Emscripten 方式\n */\n createCharacterData(shapeBuffer: ArrayBuffer, plyBuffer: ArrayBuffer): number {\n const structSize = 4 * 4 // 4 个字段\n const dataPtr = this.module._malloc(structSize)\n\n if (!dataPtr) {\n throw new Error('Failed to allocate AvatarCharacterData structure')\n }\n\n // 分配并复制数据\n const shape = this.allocateAndCopy(shapeBuffer)\n const ply = this.allocateAndCopy(plyBuffer)\n\n // 填充结构体 - 使用 setValue\n let offset = 0\n\n // shape_data, shape_size\n this.module.setValue(dataPtr + offset, shape.ptr, 'i32'); offset += 4\n this.module.setValue(dataPtr + offset, shape.size, 'i32'); offset += 4\n\n // gs_points_data, gs_points_size\n this.module.setValue(dataPtr + offset, ply.ptr, 'i32'); offset += 4\n this.module.setValue(dataPtr + offset, ply.size, 'i32'); offset += 4\n\n this.structPointers.set('character_data', dataPtr)\n return dataPtr\n }\n\n /**\n * 读取 AvatarFlameParams 结构体数据\n * Used to extract current animation frame parameters from WASM memory\n */\n readFlameParams(paramsPtr: number): {\n shape_params: number[]\n expr_params: number[]\n rotation: number[]\n translation: number[]\n neck_pose: number[]\n jaw_pose: number[]\n eyes_pose: number[]\n eyelid: number[]\n has_eyelid: boolean\n } {\n let byteOffset = 0\n\n // shape_params[300]\n const shape_params: number[] = []\n for (let i = 0; i < 300; i++) {\n shape_params.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // expr_params[100]\n const expr_params: number[] = []\n for (let i = 0; i < 100; i++) {\n expr_params.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // rotation[3]\n const rotation: number[] = []\n for (let i = 0; i < 3; i++) {\n rotation.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // translation[3]\n const translation: number[] = []\n for (let i = 0; i < 3; i++) {\n translation.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // neck_pose[3]\n const neck_pose: number[] = []\n for (let i = 0; i < 3; i++) {\n neck_pose.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // jaw_pose[3]\n const jaw_pose: number[] = []\n for (let i = 0; i < 3; i++) {\n jaw_pose.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // eyes_pose[6]\n const eyes_pose: number[] = []\n for (let i = 0; i < 6; i++) {\n eyes_pose.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // eyelid[2]\n const eyelid: number[] = []\n for (let i = 0; i < 2; i++) {\n eyelid.push(this.module.getValue(paramsPtr + byteOffset, 'float'))\n byteOffset += 4\n }\n\n // has_eyelid\n const has_eyelid = this.module.getValue(paramsPtr + byteOffset, 'i32') !== 0\n\n return {\n shape_params,\n expr_params,\n rotation,\n translation,\n neck_pose,\n jaw_pose,\n eyes_pose,\n eyelid,\n has_eyelid,\n }\n }\n\n /**\n * 创建 AvatarFlameParams 结构体 - 新版 Emscripten 方式\n */\n createFlameParams(params: {\n shape_params?: number[]\n expr_params?: number[]\n rotation?: number[]\n translation?: number[]\n neck_pose?: number[]\n jaw_pose?: number[]\n eyes_pose?: number[]\n eyelid?: number[]\n has_eyelid?: boolean\n }): number {\n const structSize = (300 + 100 + 3 + 3 + 3 + 3 + 6 + 2 + 1) * 4 // shape[300] + expr[100] + rotation[3] + translation[3] + neck[3] + jaw[3] + eyes[6] + eyelid[2] + has_eyelid[1]\n const paramsPtr = this.module._malloc(structSize)\n\n if (!paramsPtr) {\n throw new Error('Failed to allocate AvatarFlameParams structure')\n }\n\n let byteOffset = 0\n\n // shape_params[300] - 必须在最前面!\n for (let i = 0; i < 300; i++) {\n const value = params.shape_params?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // expr_params[100]\n for (let i = 0; i < 100; i++) {\n const value = params.expr_params?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // rotation[3]\n for (let i = 0; i < 3; i++) {\n const value = params.rotation?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // translation[3]\n for (let i = 0; i < 3; i++) {\n const value = params.translation?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // neck_pose[3]\n for (let i = 0; i < 3; i++) {\n const value = params.neck_pose?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // jaw_pose[3]\n for (let i = 0; i < 3; i++) {\n const value = params.jaw_pose?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // eyes_pose[6]\n for (let i = 0; i < 6; i++) {\n const value = params.eyes_pose?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // eyelid[2]\n for (let i = 0; i < 2; i++) {\n const value = params.eyelid?.[i] || 0.0\n this.module.setValue(paramsPtr + byteOffset, value, 'float')\n byteOffset += 4\n }\n\n // has_eyelid\n this.module.setValue(paramsPtr + byteOffset, params.has_eyelid ? 1 : 0, 'i32')\n byteOffset += 4\n\n return paramsPtr\n }\n\n /**\n * 读取 AvatarSplatPointFlatArray 结构体数据(预计算协方差)\n *\n * 结构体布局:\n * - AvatarSplatPointFlat* points (0-3, 32位指针)\n * - uint32_t point_count (4-7)\n * - float compute_time_ms (8-11)\n *\n * 每个点布局 (52 bytes):\n * - position[3] (12 bytes)\n * - color[4] (16 bytes, RGBA)\n * - covariance[6] (24 bytes, 预计算好的协方差矩阵上三角)\n *\n * ⚠️ 使用 getValue 逐个读取,避免动态内存的 HEAPF32 detachment 问题\n */\n readSplatPointFlatArray(arrayPtr: number): Float32Array | null {\n if (!arrayPtr) {\n throw new Error('Invalid array pointer')\n }\n\n // 读取结构体头部\n const pointsPtr = this.module.getValue(arrayPtr, 'i32')\n const pointCount = this.module.getValue(arrayPtr + 4, 'i32')\n\n if (pointCount === 0 || !pointsPtr) {\n return null\n }\n\n // 每个点: position[3] + color[4] + covariance[6] = 13 floats\n const floatsPerPoint = 13\n const totalFloats = pointCount * floatsPerPoint\n const floatOffset = pointsPtr / 4 // Float32 是 4 字节对齐\n\n // 零拷贝: 直接从 HEAPF32 复制数据\n const flatData = new Float32Array(totalFloats)\n flatData.set(this.module.HEAPF32.subarray(floatOffset, floatOffset + totalFloats))\n\n return flatData\n }\n\n /**\n * 读取AvatarMeshData结构体数据\n */\n readMeshData(outputPtr: number): {\n vertices: Float32Array\n vertexCount: number\n faces: Uint32Array\n faceCount: number\n landmarks: Float32Array | null\n landmarkCount: number\n computeTime: number\n } {\n // AvatarMeshData WASM结构体布局 (32位指针):\n // float* vertices; // 0-3 (32位指针)\n // uint32_t vertex_count; // 4-7\n // uint32_t* faces; // 8-11 (32位指针)\n // uint32_t face_count; // 12-15\n // float compute_time_ms; // 16-19\n // float* landmarks; // 20-23 (32位指针)\n // uint32_t landmark_count; // 24-27\n\n const verticesPtr = this.module.getValue(outputPtr + 0, '*')\n const vertexCount = this.module.getValue(outputPtr + 4, 'i32')\n const facesPtr = this.module.getValue(outputPtr + 8, '*')\n const faceCount = this.module.getValue(outputPtr + 12, 'i32')\n const computeTime = this.module.getValue(outputPtr + 16, 'float')\n const landmarksPtr = this.module.getValue(outputPtr + 20, '*')\n const landmarkCount = this.module.getValue(outputPtr + 24, 'i32')\n\n // 读取顶点数据 (x,y,z,x,y,z,...)\n const vertices = new Float32Array(vertexCount * 3)\n if (verticesPtr && vertexCount > 0) {\n for (let i = 0; i < vertexCount * 3; i++) {\n vertices[i] = this.module.getValue(verticesPtr + i * 4, 'float')\n }\n }\n\n // 读取面片数据 (i1,i2,i3,i1,i2,i3,...)\n const faces = new Uint32Array(faceCount * 3)\n if (facesPtr && faceCount > 0) {\n for (let i = 0; i < faceCount * 3; i++) {\n faces[i] = this.module.getValue(facesPtr + i * 4, 'i32')\n }\n }\n\n // 读取关键点数据 (可选)\n let landmarks = null\n if (landmarksPtr && landmarkCount > 0) {\n landmarks = new Float32Array(landmarkCount * 3)\n for (let i = 0; i < landmarkCount * 3; i++) {\n landmarks[i] = this.module.getValue(landmarksPtr + i * 4, 'float')\n }\n }\n\n return {\n vertices,\n vertexCount,\n faces,\n faceCount,\n landmarks,\n landmarkCount,\n computeTime,\n }\n }\n\n /**\n * 释放指定指针的内存\n */\n free(ptr: number): void {\n if (ptr && this.allocatedPointers.has(ptr)) {\n this.module._free(ptr)\n this.allocatedPointers.delete(ptr)\n }\n }\n\n /**\n * 释放结构体内存\n */\n freeStruct(name: string): void {\n const ptr = this.structPointers.get(name)\n if (ptr) {\n this.module._free(ptr)\n this.structPointers.delete(name)\n }\n }\n\n /**\n * 清理所有分配的内存\n */\n cleanup(): void {\n // 释放所有分配的指针\n for (const ptr of this.allocatedPointers) {\n this.module._free(ptr)\n }\n this.allocatedPointers.clear()\n\n // 释放所有结构体指针\n for (const [, ptr] of this.structPointers) {\n this.module._free(ptr)\n }\n this.structPointers.clear()\n }\n\n /**\n * 获取内存使用统计\n */\n getMemoryStats(): {\n allocatedPointers: number\n structPointers: number\n totalAllocatedMB: number\n } {\n return {\n allocatedPointers: this.allocatedPointers.size,\n structPointers: this.structPointers.size,\n totalAllocatedMB: Math.round((this.allocatedPointers.size * 1024) / 1024),\n }\n }\n}\n","/**\n * Avatar Core WASM 适配器\n *\n * 完全替换 FlameComplete3DGSManager,提供 avatar_core_wasm 的完整功能\n * 包括牙齿细分、眼部追踪等高级特性\n */\n\nimport type { TemplateResources } from './avatarCoreMemory'\n\nimport { logger } from '../utils/logger'\nimport { AvatarCoreMemoryManager } from './avatarCoreMemory'\n\n// WASM memory management (gc function may be available in debug mode)\ndeclare const gc: (() => void) | undefined\n\n// WASM 模块配置类型\nexport interface WasmModuleConfig {\n baseUrl?: string\n [key: string]: unknown\n}\n\n// 类型定义\nexport interface AvatarCoreOptions {\n logLevel?: 'basic' | 'verbose'\n enableValidation?: boolean\n enablePerformanceMetrics?: boolean\n retryCount?: number\n baseAssetsPath?: string\n modelFolder?: string\n wasmConfig?: WasmModuleConfig\n wasmPath?: string\n}\n\ninterface PerformanceMetrics {\n initTime: number\n loadTime: number\n computeFrames: number\n totalComputeTime: number\n averageComputeTime: number\n}\n\nexport interface FlameInfo {\n vertexCount: number\n faceCount: number\n jointCount: number\n}\n\nexport interface CharacterInfo {\n pointCount: number\n hasAnimation: boolean\n}\n\ninterface ProgressCallback {\n (info: { message: string, progress: number }): void\n}\n\nexport interface FlameParams {\n shape_params?: number[]\n expr_params?: number[]\n rotation?: number[]\n translation?: number[]\n neck_pose?: number[]\n jaw_pose?: number[]\n eyes_pose?: number[]\n eyelid?: number[]\n has_eyelid?: boolean\n}\n\nexport class AvatarCoreAdapter {\n // 配置\n private options: Required<Omit<AvatarCoreOptions, 'wasmConfig'>> & { wasmConfig?: WasmModuleConfig }\n private wasmConfig: WasmModuleConfig\n\n // 核心组件\n // eslint-disable-next-line ts/no-explicit-any\n private wasmModule: any\n private memoryManager: AvatarCoreMemoryManager | null\n\n // Avatar Core handles\n private coreHandle: number | null\n private characterHandle: number | null\n private animationHandle: number | null\n private totalFrames: number | null\n\n // 状态管理\n private isInitialized: boolean\n private isCharacterLoaded: boolean\n\n // C API 函数包装\n // eslint-disable-next-line ts/no-explicit-any\n private api: any\n\n // 性能监控\n private performanceMetrics: PerformanceMetrics\n public wasmTime = 0 // 最近一次 WASM 计算耗时\n\n // 错误码映射\n private errorCodes: Record<number, string>\n\n // 模型信息\n private flameInfo?: FlameInfo\n private characterInfo?: CharacterInfo\n\n constructor(options: AvatarCoreOptions = {}) {\n this.options = {\n logLevel: 'basic',\n enableValidation: true,\n enablePerformanceMetrics: true,\n retryCount: 3,\n baseAssetsPath: '/',\n modelFolder: '3dgs',\n wasmPath: './wasm/avatar_core_wasm.wasm',\n ...options,\n }\n\n // Store wasmConfig for use in loadWASMModule\n this.wasmConfig = options.wasmConfig || { baseUrl: undefined }\n\n // 核心组件\n this.wasmModule = null\n this.memoryManager = null\n\n // Avatar Core handles\n this.coreHandle = null\n this.characterHandle = null\n this.animationHandle = null\n this.totalFrames = null // 缓存动画总帧数\n\n // 状态管理\n this.isInitialized = false\n this.isCharacterLoaded = false\n\n // C API 函数包装\n this.api = {}\n\n // 性能监控\n this.performanceMetrics = {\n initTime: 0,\n loadTime: 0,\n computeFrames: 0,\n totalComputeTime: 0,\n averageComputeTime: 0,\n }\n\n // 错误码映射\n this.errorCodes = {\n 0: 'AVATAR_SUCCESS',\n 1: 'AVATAR_ERROR_INVALID_PARAMETER',\n 2: 'AVATAR_ERROR_MEMORY_ALLOCATION',\n 3: 'AVATAR_ERROR_INVALID_DATA_FORMAT',\n 4: 'AVATAR_ERROR_CHARACTER_NOT_FOUND',\n 5: 'AVATAR_ERROR_ANIMATION_NOT_FOUND',\n 6: 'AVATAR_ERROR_COMPUTATION_FAILED',\n }\n }\n\n /**\n * 加载 WASM 模块并设置 API\n * 每次都创建全新的 WASM 实例,确保 C++ 内存是干净的\n * \n * 注意:这里使用动态 import() 导入 WASM 模块。\n * Vite 在构建时会自动为 WASM 文件和 JS glue 代码添加 hash(如 avatar_core_wasm-CxWuw7eS.wasm),\n * 确保浏览器缓存与版本一致,不会有缓存问题。\n * \n * Hash 的作用机制:\n * - WASM 文件内容变化 → hash 自动变化 → URL 变化 → 浏览器拉取新版本\n * - WASM 文件内容不变 → hash 保持不变 → URL 不变 → 浏览器使用缓存\n * - Emscripten 生成的 JS 内部会使用 hard-coded 的 hash 路径加载 .wasm 文件\n */\n async loadWASMModule(): Promise<void> {\n try {\n // 静态导入 WASM 模块(Vite 会正确处理路径)\n // @ts-expect-error - WASM module import\n const { default: AvatarCoreModule } = await import('./avatar_core_wasm.js')\n\n // 如果有 wasmConfig,传递给 WASM 模块初始化\n if (this.wasmConfig && Object.keys(this.wasmConfig).length > 0) {\n this.wasmModule = await AvatarCoreModule(this.wasmConfig)\n }\n else {\n this.wasmModule = await AvatarCoreModule()\n }\n\n // 验证 WASM 模块\n this.validateWASMModule()\n\n // 初始化内存管理器\n this.memoryManager = new AvatarCoreMemoryManager(this.wasmModule)\n\n // 设置 C API 函数\n this.setupCAPIFunctions()\n\n logger.log('✅ Created new WASM instance with clean C++ memory')\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to load WASM module: ${errorMessage}`)\n }\n }\n\n /**\n * 验证 WASM 模块功能\n */\n private validateWASMModule(): void {\n // 验证基础函数\n const requiredFunctions = ['cwrap', '_malloc', '_free', 'setValue', 'getValue', 'writeArrayToMemory']\n\n for (const funcName of requiredFunctions) {\n if (typeof this.wasmModule[funcName] !== 'function') {\n throw new TypeError(`WASM module missing required function: ${funcName}`)\n }\n }\n\n // 初始化内存视图\n this.initializeMemoryViews()\n }\n\n /**\n * 初始化内存视图\n */\n private initializeMemoryViews(): void {\n try {\n // 测试内存分配和读写\n const testPtr = this.wasmModule._malloc(4)\n if (!testPtr) {\n throw new Error('Memory allocation test failed')\n }\n\n const testValue = 0x12345678\n this.wasmModule.setValue(testPtr, testValue, 'i32')\n const readValue = this.wasmModule.getValue(testPtr, 'i32')\n\n if (readValue !== testValue) {\n throw new Error('Memory read/write test failed')\n }\n\n this.wasmModule._free(testPtr)\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Memory system initialization failed: ${errorMessage}`)\n }\n }\n\n /**\n * 设置 C API 函数包装\n */\n private setupCAPIFunctions(): void {\n this.api = {\n // 核心系统管理\n initialize: this.wasmModule.cwrap('avatar_core_initialize', 'number', ['number']), // 返回 handle\n release: this.wasmModule.cwrap('avatar_core_release', null, ['number']),\n getVersion: this.wasmModule.cwrap('avatar_core_get_version', 'string', []),\n getErrorString: this.wasmModule.cwrap('avatar_core_get_error_string', 'string', ['number']),\n resetProcessorForReuse: this.wasmModule.cwrap('avatar_core_reset_processor_for_reuse', null, ['number']),\n // 角色管理\n loadCharacter: this.wasmModule.cwrap('avatar_core_load_character', 'number', ['number', 'number']), // 返回 handle\n removeCharacter: this.wasmModule.cwrap('avatar_core_remove_character', null, ['number', 'number']),\n getCharacterInfo: this.wasmModule.cwrap('avatar_core_get_character_info', 'number', ['number', 'number', 'number']),\n\n // 动画管理\n loadAnimation: this.wasmModule.cwrap('avatar_core_load_animation', 'number', ['number', 'number']),\n parseAnimationFramesFromFile: this.wasmModule.cwrap('avatar_core_parse_animation_frames_from_file', 'number', ['number', 'number', 'number']),\n getAnimationFrameCount: this.wasmModule.cwrap('avatar_core_get_animation_frame_count', 'number', ['number', 'number']),\n getFrameFromAnimation: this.wasmModule.cwrap('avatar_core_get_frame_from_animation', 'number', ['number', 'number', 'number']),\n removeAnimation: this.wasmModule.cwrap('avatar_core_remove_animation', null, ['number', 'number']),\n\n // 帧计算 (Flat 格式 - GPU 优化版本,协方差预计算)\n computeFrameFlat: this.wasmModule.cwrap('avatar_core_compute_frame_as_splat_points_flat', 'number', ['number', 'number', 'number', 'number']), // 返回错误码\n freeSplatPointsFlat: this.wasmModule.cwrap('avatar_core_free_splat_points_flat', null, ['number']),\n\n // Mesh 计算(用于传统 mesh 渲染)\n computeFrameAsMesh: this.wasmModule.cwrap('avatar_core_compute_frame_as_mesh', 'number', ['number', 'number', 'number', 'number']), // 返回错误码\n freeMeshData: this.wasmModule.cwrap('avatar_core_free_mesh_data', null, ['number']),\n\n // 眼部追踪(高级功能)\n setEyeTrackingConfig: this.wasmModule.cwrap('avatar_core_set_eye_tracking_config', 'number', ['number', 'number', 'number']), // core, character, config\n setGazeTarget: this.wasmModule.cwrap('avatar_core_set_gaze_target', 'number', ['number', 'number', 'number', 'number', 'number']), // core, character, x, y, z\n resetEyeTracking: this.wasmModule.cwrap('avatar_core_reset_eye_tracking', 'number', ['number']),\n\n // FLAME 信息查询\n getFlameInfo: this.wasmModule.cwrap('avatar_core_get_flame_info', 'number', ['number', 'number', 'number', 'number']),\n }\n }\n\n /**\n * 读取当前动画帧的 FlameParams(用于过渡或调试)\n */\n async getCurrentFrameParams(frameIndex: number = 0): Promise<FlameParams> {\n // 直接复用已验证的 API:getAnimationFrameParams(出参 + 错误码)\n const paramsPtr = await this.getAnimationFrameParams(frameIndex)\n try {\n const params = this.memoryManager!.readFlameParams(paramsPtr)\n return params as FlameParams\n }\n finally {\n this.wasmModule._free(paramsPtr)\n }\n }\n\n /**\n * 初始化 Avatar Core 核心\n */\n private async initializeAvatarCore(templateResources: TemplateResources): Promise<void> {\n try {\n // 创建模板配置结构体\n const configPtr = this.memoryManager!.createTemplateConfig(templateResources)\n\n // 调用 avatar_core_initialize - 返回 handle,失败时返回 NULL\n const coreHandle = this.api.initialize(configPtr)\n\n if (!coreHandle) {\n throw new Error('avatar_core_initialize returned NULL - initialization failed')\n }\n\n // 保存 core handle\n this.coreHandle = coreHandle\n\n // 查询 FLAME 模型信息\n await this.queryFlameInfo()\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to initialize Avatar Core: ${errorMessage}`)\n }\n }\n\n /**\n * 加载模板资源(从预加载的 ArrayBuffers)\n */\n async loadTemplateResourcesFromBuffers(templateResources: Record<string, ArrayBuffer>): Promise<boolean> {\n // Convert Record<string, ArrayBuffer> to TemplateResources format\n const formattedResources: TemplateResources = {\n flameModel: templateResources.flameModel || templateResources['model.pb'] || new ArrayBuffer(0),\n flameTemplate: templateResources.flameTemplate || templateResources['flame_template.pb'] || new ArrayBuffer(0),\n teethPb: templateResources.teethPb || templateResources['teeth.pb'] || new ArrayBuffer(0),\n teethNpz: templateResources.teethNpz || templateResources['teeth.npz'] || new ArrayBuffer(0),\n }\n if (!this.wasmModule || !this.memoryManager) {\n throw new Error('WASM module not loaded')\n }\n\n // 如果已经初始化,跳过\n if (this.isInitialized && this.coreHandle) {\n return true\n }\n\n try {\n // 初始化 Avatar Core\n await this.initializeAvatarCore(formattedResources)\n this.isInitialized = true\n return true\n }\n catch (error) {\n logger.errorWithError('❌ Template resources loading failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Template resources loading failed: ${errorMessage}`)\n }\n }\n\n /**\n * 加载角色数据(从预加载的 ArrayBuffers)\n */\n async loadCharacterFromBuffers(\n shapeBuffer: ArrayBuffer,\n pointCloudBuffer: ArrayBuffer,\n ): Promise<boolean> {\n if (!this.isInitialized) {\n throw new Error('Avatar Core not initialized')\n }\n\n const startTime = performance.now()\n\n try {\n // 创建角色数据结构体\n const dataPtr = this.memoryManager!.createCharacterData(\n shapeBuffer,\n pointCloudBuffer,\n )\n\n // 调用 avatar_core_load_character - 返回 handle,失败时返回 NULL\n const characterHandle = this.api.loadCharacter(this.coreHandle, dataPtr)\n\n if (!characterHandle) {\n throw new Error('avatar_core_load_character returned NULL - character loading failed')\n }\n\n // 保存 character handle\n this.characterHandle = characterHandle\n this.isCharacterLoaded = true\n\n // 查询角色信息\n await this.queryCharacterInfo()\n\n this.performanceMetrics.loadTime = performance.now() - startTime\n\n return true\n }\n catch (error) {\n logger.errorWithError('❌ Character loading failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Character loading failed: ${errorMessage}`)\n }\n }\n\n private async loadAnimationFromData(animData: ArrayBuffer): Promise<number> {\n const animPtr = this.memoryManager!.allocateAndCopy(animData)\n const animStruct = this.wasmModule._malloc(8)\n this.wasmModule.setValue(animStruct, animPtr.ptr, 'i32')\n this.wasmModule.setValue(animStruct + 4, animPtr.size, 'i32')\n\n const handle = this.api.loadAnimation(this.coreHandle, animStruct)\n this.wasmModule._free(animStruct)\n\n if (!handle) {\n throw new Error('avatar_core_load_animation returned NULL')\n }\n\n return handle\n }\n\n /**\n * Load animation from ArrayBuffer (for CDN-based dynamic loading)\n */\n async loadAnimationFromBuffer(animData: ArrayBuffer): Promise<number> {\n if (!this.isInitialized) {\n throw new Error('Avatar Core not initialized')\n }\n\n try {\n this.animationHandle = await this.loadAnimationFromData(animData)\n await this.getAnimationTotalFrames()\n return this.animationHandle\n }\n catch (error) {\n logger.errorWithError('❌ Failed to load animation from buffer:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to load animation from buffer: ${errorMessage}`)\n }\n }\n\n async switchAnimationFile(animationFile: string): Promise<number> {\n if (!this.isInitialized) {\n throw new Error('Avatar Core not initialized')\n }\n\n try {\n const animationPath = `${this.options.baseAssetsPath}/${this.options.modelFolder}/${animationFile}`\n const fullUrl = this.wasmConfig.baseUrl ? `${this.wasmConfig.baseUrl}${animationPath}` : animationPath\n const response = await fetch(fullUrl)\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n const animData = await response.arrayBuffer()\n const newHandle = await this.loadAnimationFromData(animData)\n\n this.animationHandle = newHandle\n this.totalFrames = null\n await this.getAnimationTotalFrames()\n\n return this.totalFrames!\n }\n catch (error) {\n logger.errorWithError(`❌ Failed to switch animation to ${animationFile}:`, error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to switch animation: ${errorMessage}`)\n }\n }\n\n /**\n * 获取动画总帧数\n */\n async getAnimationTotalFrames(): Promise<number> {\n if (this.totalFrames !== null) {\n return this.totalFrames\n }\n\n if (!this.animationHandle) {\n throw new Error('No animation loaded')\n }\n\n try {\n // 分配输出参数内存\n const frameCountPtr = this.wasmModule._malloc(4) // uint32_t\n\n // 调用 avatar_core_get_animation_frame_count\n const result = this.api.getAnimationFrameCount(this.animationHandle, frameCountPtr)\n\n if (result !== 0) { // AVATAR_SUCCESS = 0\n this.wasmModule._free(frameCountPtr)\n const errorMsg = this.api.getErrorString(result)\n throw new Error(`Failed to get animation frame count: ${errorMsg}`)\n }\n\n // 读取帧数\n const frameCount = this.wasmModule.getValue(frameCountPtr, 'i32') as number\n this.wasmModule._free(frameCountPtr)\n this.totalFrames = frameCount\n\n return frameCount\n }\n catch (error) {\n logger.errorWithError('❌ Failed to get animation frame count:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to get animation frame count: ${errorMessage}`)\n }\n }\n\n /**\n * 从动画中获取指定帧的参数\n */\n async getAnimationFrameParams(frameIndex: number = 0): Promise<number> {\n if (!this.animationHandle) {\n throw new Error('No animation loaded')\n }\n\n // 验证帧索引范围,循环播放\n if (this.totalFrames !== null && this.totalFrames > 0) {\n frameIndex = frameIndex % this.totalFrames\n if (frameIndex < 0)\n frameIndex += this.totalFrames\n }\n\n try {\n // 分配AvatarFlameParams结构体内存 (118个float = 472字节)\n const paramsPtr = this.wasmModule._malloc(118 * 4)\n\n // 调用avatar_core_get_frame_from_animation\n const result = this.api.getFrameFromAnimation(this.animationHandle, frameIndex, paramsPtr)\n\n if (result !== 0) { // AVATAR_SUCCESS = 0\n this.wasmModule._free(paramsPtr)\n const errorMsg = this.api.getErrorString(result)\n throw new Error(`Failed to get frame ${frameIndex}: ${errorMsg}`)\n }\n\n return paramsPtr // 返回参数指针,由computeFrame使用\n }\n catch (error) {\n logger.errorWithError(`❌ Failed to get animation frame ${frameIndex}:`, error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to get animation frame ${frameIndex}: ${errorMessage}`)\n }\n }\n\n /**\n * 设置眼部追踪配置(对齐 app 实现)\n */\n async setEyeTrackingConfig(config: {\n enabled: boolean\n auto_eyelid_adjustment?: boolean\n eyelid_threshold?: number\n }): Promise<boolean> {\n if (!this.isCharacterLoaded) {\n throw new Error('Character not loaded')\n }\n try {\n // struct { bool enabled; bool auto_eyelid_adjustment; float eyelid_threshold; }\n const configPtr = this.wasmModule._malloc(12)\n this.wasmModule.setValue(configPtr, config.enabled ? 1 : 0, 'i32')\n this.wasmModule.setValue(configPtr + 4, config.auto_eyelid_adjustment !== false ? 1 : 0, 'i32')\n this.wasmModule.setValue(configPtr + 8, config.eyelid_threshold || 0.2, 'float')\n\n const result = this.api.setEyeTrackingConfig(this.coreHandle, this.characterHandle, configPtr)\n this.wasmModule._free(configPtr)\n this.checkError(result, 'avatar_core_set_eye_tracking_config')\n return true\n }\n catch (error) {\n logger.errorWithError('❌ Failed to set eye tracking config:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to set eye tracking config: ${errorMessage}`)\n }\n }\n\n /**\n * 设置眼部追踪目标(高级功能)\n */\n async setGazeTarget(x: number, y: number, z: number): Promise<boolean> {\n if (!this.isCharacterLoaded) {\n throw new Error('Character not loaded')\n }\n\n try {\n const result = this.api.setGazeTarget(this.coreHandle, this.characterHandle, x, y, z)\n this.checkError(result, 'avatar_core_set_gaze_target')\n\n return true\n }\n catch (error) {\n logger.errorWithError('❌ Failed to set gaze target:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to set gaze target: ${errorMessage}`)\n }\n }\n\n /**\n * 重置眼部追踪\n */\n async resetEyeTracking(): Promise<boolean> {\n if (!this.isCharacterLoaded) {\n throw new Error('Character not loaded')\n }\n\n try {\n const result = this.api.resetEyeTracking(this.coreHandle)\n this.checkError(result, 'avatar_core_reset_eye_tracking')\n\n return true\n }\n catch (error) {\n logger.errorWithError('❌ Failed to reset eye tracking:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to reset eye tracking: ${errorMessage}`)\n }\n }\n\n /**\n * 查询 FLAME 模型信息\n */\n private async queryFlameInfo(): Promise<void> {\n try {\n // 分配输出参数\n const vertexCountPtr = this.wasmModule._malloc(4)\n const faceCountPtr = this.wasmModule._malloc(4)\n const jointCountPtr = this.wasmModule._malloc(4)\n\n const result = this.api.getFlameInfo(\n this.coreHandle,\n vertexCountPtr,\n faceCountPtr,\n jointCountPtr,\n )\n\n this.checkError(result, 'avatar_core_get_flame_info')\n\n // 读取结果\n const vertexCount = this.wasmModule.getValue(vertexCountPtr, 'i32')\n const faceCount = this.wasmModule.getValue(faceCountPtr, 'i32')\n const jointCount = this.wasmModule.getValue(jointCountPtr, 'i32')\n\n // 释放内存\n this.wasmModule._free(vertexCountPtr)\n this.wasmModule._free(faceCountPtr)\n this.wasmModule._free(jointCountPtr)\n\n this.flameInfo = { vertexCount, faceCount, jointCount }\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.errorWithError('❌ Failed to query FLAME info:', errorMessage)\n }\n }\n\n /**\n * 查询角色信息\n */\n private async queryCharacterInfo(): Promise<void> {\n try {\n const pointCountPtr = this.wasmModule._malloc(4)\n const hasAnimationPtr = this.wasmModule._malloc(1)\n\n const result = this.api.getCharacterInfo(\n this.characterHandle,\n pointCountPtr,\n hasAnimationPtr,\n )\n\n this.checkError(result, 'avatar_core_get_character_info')\n\n const pointCount = this.wasmModule.getValue(pointCountPtr, 'i32')\n const hasAnimation = this.wasmModule.getValue(hasAnimationPtr, 'i8') !== 0\n\n this.wasmModule._free(pointCountPtr)\n this.wasmModule._free(hasAnimationPtr)\n\n this.characterInfo = { pointCount, hasAnimation }\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.errorWithError('❌ Failed to query character info:', errorMessage)\n }\n }\n\n /**\n * 检查错误码并抛出异常\n */\n private checkError(errorCode: number, functionName: string): void {\n if (errorCode !== 0) {\n const errorName = this.errorCodes[errorCode] || `UNKNOWN_ERROR_${errorCode}`\n const errorMessage = this.api.getErrorString(errorCode)\n logger.errorWithError(`❌ ${functionName} failed: code=${errorCode}, name=${errorName}, message=${errorMessage}`, new Error(`${functionName} failed: ${errorName} - ${errorMessage}`))\n throw new Error(`${functionName} failed: ${errorName} - ${errorMessage}`)\n }\n }\n\n /**\n * 更新进度回调\n */\n private async updateProgress(callback: ProgressCallback | null, message: string, progress: number): Promise<void> {\n if (callback && typeof callback === 'function') {\n callback({ message, progress })\n }\n }\n\n /**\n * 获取性能指标\n */\n getPerformanceMetrics(): PerformanceMetrics & {\n memoryStats?: ReturnType<AvatarCoreMemoryManager['getMemoryStats']>\n flameInfo?: FlameInfo\n characterInfo?: CharacterInfo\n version?: string\n } {\n return {\n ...this.performanceMetrics,\n memoryStats: this.memoryManager?.getMemoryStats(),\n flameInfo: this.flameInfo,\n characterInfo: this.characterInfo,\n version: this.api.getVersion?.() || 'unknown',\n }\n }\n\n /**\n * 释放当前角色和动画资源(但保留 core)\n */\n releaseCurrentCharacter(): void {\n try {\n // 先清理动画句柄(如果存在)\n if (this.animationHandle && this.coreHandle) {\n this.api.removeAnimation(this.coreHandle, this.animationHandle)\n this.animationHandle = null\n this.totalFrames = null\n }\n\n // 释放角色(会自动清理关联的动画资源)\n if (this.characterHandle && this.coreHandle) {\n this.api.removeCharacter(this.coreHandle, this.characterHandle)\n this.characterHandle = null\n this.isCharacterLoaded = false\n }\n\n this.api.resetProcessorForReuse(this.coreHandle)\n\n // 清理内存\n if (this.memoryManager) {\n this.memoryManager.cleanup()\n }\n\n // 重置 isCharacterLoaded 状态,但不设置 isInitialized = false(保持 core 初始化状态)\n }\n catch (error) {\n logger.errorWithError('❌ Failed to release character:', error)\n }\n }\n\n /**\n * 释放所有资源(包括 core)\n */\n release(): void {\n try {\n // 先释放角色和动画\n this.releaseCurrentCharacter()\n\n // 释放 Core\n if (this.coreHandle) {\n this.api.release(this.coreHandle)\n this.coreHandle = null\n }\n\n // 清理内存\n if (this.memoryManager) {\n this.memoryManager.cleanup()\n }\n\n this.isInitialized = false\n\n if (this.wasmModule.HEAPU8) {\n // 清理可能的缓存\n if (this.wasmModule.HEAPU8.buffer) {\n // 强制垃圾回收(如果支持)\n if (typeof gc !== 'undefined') {\n gc()\n }\n }\n }\n }\n catch (error) {\n logger.errorWithError('❌ Failed to release resources:', error)\n }\n }\n\n /**\n * 兼容性接口:提供与 FlameComplete3DGSManager 相同的接口\n */\n\n // 兼容 loadFlameModel\n // eslint-disable-next-line ts/no-explicit-any\n async loadFlameModel(_modelData: any): Promise<boolean> {\n // Avatar Core 通过初始化时加载模板资源,这里是空实现\n return true\n }\n\n // 兼容 load3DGSData\n // eslint-disable-next-line ts/no-explicit-any\n async load3DGSData(_original3DGSPoints: any, _binding: any, _flameFaces: any): Promise<boolean> {\n // Avatar Core 通过 loadCharacter 处理,这里是空实现\n return true\n }\n\n /**\n * 计算帧并返回 GPU 友好的 flat 格式(零拷贝,协方差预计算)\n * 🚀 性能优化版本:\n * - C++ 预计算协方差矩阵\n * - 零拷贝直接访问 WASM 内存http://localhost:3000/us/\n * - 直接输出 GPU 格式 [pos3, color4, cov6]\n */\n async computeCompleteFrameFlat(params?: { frameIndex?: number }): Promise<Float32Array | null> {\n if (!this.isCharacterLoaded) {\n throw new Error('Character not loaded')\n }\n\n const startTime = performance.now()\n let outputPtr: number | null = null\n let paramsPtr: number | null = null\n\n try {\n const frameIndex = params?.frameIndex ?? 0\n\n // 获取指定帧的参数\n paramsPtr = await this.getAnimationFrameParams(frameIndex)\n\n // 分配输出结构体\n outputPtr = this.wasmModule._malloc(16) // AvatarSplatPointFlatArray 大小\n\n // 调用 flat 版本的计算函数\n const result = this.api.computeFrameFlat(\n this.coreHandle,\n this.characterHandle,\n paramsPtr,\n outputPtr,\n )\n\n this.checkError(result, 'avatar_core_compute_frame_as_splat_points_flat')\n\n // 读取结果(已经是复制的数据,无需再次复制)\n const flatData = this.memoryManager!.readSplatPointFlatArray(outputPtr!)\n\n // 更新性能指标\n const computeTime = performance.now() - startTime\n this.wasmTime = computeTime // 记录最近一次耗时\n this.performanceMetrics.computeFrames++\n this.performanceMetrics.totalComputeTime += computeTime\n this.performanceMetrics.averageComputeTime\n = this.performanceMetrics.totalComputeTime / this.performanceMetrics.computeFrames\n\n return flatData\n }\n catch (error) {\n logger.errorWithError('❌ computeCompleteFrameFlat failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`computeCompleteFrameFlat failed: ${errorMessage}`)\n }\n finally {\n // 清理内存(必须按正确顺序)\n if (outputPtr !== null) {\n // 释放 C++ 分配的点云数据\n this.api.freeSplatPointsFlat(outputPtr)\n // 释放输出结构体\n this.wasmModule._free(outputPtr)\n }\n if (paramsPtr !== null) {\n this.wasmModule._free(paramsPtr)\n }\n }\n }\n\n /**\n * 计算帧并返回 GPU 友好的 flat 格式(从 FLAME 参数)\n * 🔑 用于 Realtime: 接受自定义 FLAME 参数并计算 Splat\n */\n async computeFrameFlatFromParams(flameParams: FlameParams): Promise<Float32Array | null> {\n if (!this.isCharacterLoaded) {\n throw new Error('Character not loaded')\n }\n\n const startTime = performance.now()\n let outputPtr: number | null = null\n let paramsPtr: number | null = null\n\n try {\n // 创建参数结构体\n paramsPtr = this.memoryManager!.createFlameParams(flameParams)\n\n // 分配输出结构体\n outputPtr = this.wasmModule._malloc(16) // AvatarSplatPointFlatArray 大小\n\n // 调用 flat 版本的计算函数\n const result = this.api.computeFrameFlat(\n this.coreHandle,\n this.characterHandle,\n paramsPtr,\n outputPtr,\n )\n\n this.checkError(result, 'avatar_core_compute_frame_as_splat_points_flat')\n\n // 读取结果\n const flatData = this.memoryManager!.readSplatPointFlatArray(outputPtr!)\n\n // 更新性能指标\n const computeTime = performance.now() - startTime\n this.wasmTime = computeTime\n this.performanceMetrics.computeFrames++\n this.performanceMetrics.totalComputeTime += computeTime\n this.performanceMetrics.averageComputeTime\n = this.performanceMetrics.totalComputeTime / this.performanceMetrics.computeFrames\n\n return flatData\n }\n catch (error) {\n logger.errorWithError('❌ computeFrameFlatFromParams failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`computeFrameFlatFromParams failed: ${errorMessage}`)\n }\n finally {\n // 清理内存\n if (outputPtr !== null) {\n this.api.freeSplatPointsFlat(outputPtr)\n this.wasmModule._free(outputPtr)\n }\n if (paramsPtr !== null) {\n this.wasmModule._free(paramsPtr)\n }\n }\n }\n}\n","/**\n * AvatarKit:负责 SDK 初始化和配置\n * 所有公开接口全部采用 Class/Static Func;无需开发者访问单例/实例化\n */\n\nimport type { Configuration } from '../types'\n\nimport { clearSdkConfigCache, fetchSdkConfig } from '../config/sdk-config-loader'\nimport { Environment } from '../types'\nimport { logger } from '../utils/logger'\nimport { initializeCLS, trackEvent, cleanupCLS } from '../utils/cls-tracker'\nimport { AvatarCoreAdapter } from '../wasm/avatarCoreAdapter'\n\nexport class AvatarKit {\n private static _isInitialized = false\n private static _configuration: Configuration | null = null\n private static _sessionToken: string | null = null\n private static _userId: string | null = null\n private static readonly _version: string = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : '1.0.0'\n private static _avatarCore: AvatarCoreAdapter | null = null\n private static _dynamicSdkConfig: Partial<Record<Environment, string>> | null = null\n private static readonly _logLevels = {\n debug: 'log',\n info: 'log',\n warning: 'warn',\n error: 'error',\n } as const\n\n /**\n * SDK 初始化\n * @param appId 前端需要在 HTTP Headers 和 WebSocket Headers 中都带上\n * @param configuration 配置参数\n */\n static async initialize(appId: string, configuration: Configuration): Promise<void> {\n try {\n if (this._isInitialized) {\n // 如果已经初始化,只需要更新配置\n logger.log(`[AvatarKit] Re-initializing with new environment: ${configuration.environment}`)\n this._configuration = configuration\n return\n }\n\n logger.log(`[AvatarKit] Initializing with appId: ${appId}, environment: ${configuration.environment}`)\n\n // 1. 初始化配置\n this._configuration = configuration\n\n // 2. 初始化 CLS 日志上报(传入环境信息)\n initializeCLS(configuration.environment)\n\n // 3. 从配置接口获取sdkApiBaseUrl(与WASM初始化并行)\n this._fetchSdkConfig().catch((err) => {\n const message = err instanceof Error ? err.message : String(err)\n logger.warn('Failed to fetch SDK config from remote, using defaults:', message)\n this.logEvent('sdk_config', 'warning', {\n reason: message,\n })\n })\n\n // 4. 初始化WASM模块\n await this.initializeWASMModule()\n\n this._isInitialized = true\n\n logger.log(`[AvatarKit] Successfully initialized`)\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('Failed to initialize AvatarKit:', errorMessage)\n this.logEvent('sdk_startup', 'error', {\n reason: errorMessage,\n })\n throw error\n }\n }\n\n /**\n * 初始化WASM模块(跟随整个SDK生命周期)\n */\n private static async initializeWASMModule(): Promise<void> {\n try {\n logger.log('[AvatarKit] Initializing WASM module...')\n\n // 创建AvatarCoreAdapter实例\n this._avatarCore = new AvatarCoreAdapter({\n logLevel: 'basic',\n enableValidation: true,\n enablePerformanceMetrics: true,\n baseAssetsPath: '',\n wasmPath: './avatar_core_wasm.js',\n wasmConfig: {\n // Print function for debugging WASM output\n print: (text: string) => {\n logger.log(`[WASM] ${text}`)\n },\n printErr: (text: string) => {\n logger.error(`[WASM ERROR] ${text}`)\n },\n // 配置 locateFile 以确保能找到 WASM 文件\n // WASM 文件与 Emscripten JS 文件在同一目录(dist/ 根目录)\n locateFile: (path: string, prefix: string) => {\n // 如果 path 已经是完整 URL(data URL 或 http(s) URL),直接返回\n if (path.startsWith('data:') || path.startsWith('http://') || path.startsWith('https://')) {\n return path\n }\n // 确保路径拼接正确:如果 prefix 末尾没有斜杠,则添加\n return prefix.endsWith('/') ? prefix + path : `${prefix}/${path}`\n },\n },\n })\n\n // 加载WASM模块\n await this._avatarCore.loadWASMModule()\n\n logger.log('[AvatarKit] WASM module initialized successfully')\n }\n catch (error) {\n logger.error('Failed to initialize WASM module:', error instanceof Error ? error.message : String(error))\n throw new Error(`WASM module initialization failed: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n\n /**\n * 设置 sessionToken\n * 开发者 Client -> 开发者 Server -> SP Server -> return sessionToken(最长一小时有效时间)\n * 在 WebSocket Headers 中带上,用于数字人 WebSocket 服务鉴权\n */\n static setSessionToken(token: string): void {\n this._sessionToken = token\n }\n\n /**\n * 设置 userId\n * 开发者可选接口,SDK 在日志埋点中带上\n */\n static setUserId(userId: string): void {\n this._userId = userId\n }\n\n // 只读属性\n static get isInitialized(): boolean {\n return this._isInitialized\n }\n\n static get configuration(): Configuration | null {\n return this._configuration\n }\n\n static get sessionToken(): string | null {\n return this._sessionToken\n }\n\n static get userId(): string | null {\n return this._userId\n }\n\n static get version(): string {\n return this._version\n }\n\n /**\n * 获取AvatarCore实例(仅供 SDK 内部使用)\n * @internal\n */\n static getAvatarCore(): AvatarCoreAdapter | null {\n return this._avatarCore\n }\n\n /**\n * 清理资源\n */\n static cleanup(): void {\n if (!this._isInitialized) {\n return\n }\n\n try {\n if (this._avatarCore) {\n this._avatarCore.release()\n this._avatarCore = null\n }\n\n this._configuration = null\n this._sessionToken = null\n this._userId = null\n this._dynamicSdkConfig = null\n this._isInitialized = false\n\n clearSdkConfigCache()\n cleanupCLS()\n\n logger.log('[AvatarKit] Cleanup completed')\n }\n catch (error) {\n logger.error('Failed to cleanup AvatarKit:', error instanceof Error ? error.message : String(error))\n }\n }\n\n /**\n * 从远程配置接口获取SDK配置(已简化,逻辑移到 config/sdk-config-loader.ts)\n */\n private static async _fetchSdkConfig(): Promise<void> {\n try {\n this._dynamicSdkConfig = await fetchSdkConfig(this._version)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.warn('Failed to fetch SDK config from remote, using defaults:', message)\n this.logEvent('sdk_config', 'warning', {\n reason: message,\n })\n // 不抛出错误,使用默认配置\n }\n }\n\n /**\n * 获取环境配置(对齐 web 应用的 region-config)\n */\n static getEnvironmentConfig(): {\n sdkApiBaseUrl: string\n realtimeApiBaseUrl: string\n realtimeWsUrl: string\n driveningressWsUrl: string\n } {\n if (!this._configuration) {\n throw new Error('AvatarKit not initialized')\n }\n\n // 默认配置(降级方案)\n const defaultConfigs: Record<Environment, { sdkApiBaseUrl: string, realtimeApiBaseUrl: string, realtimeWsUrl: string, driveningressWsUrl: string }> = {\n [Environment.cn]: {\n sdkApiBaseUrl: 'https://api.spatialwalk.top',\n realtimeApiBaseUrl: 'https://enjoi.spatialwalk.top',\n realtimeWsUrl: 'wss://enjoi.spatialwalk.top/v1/realtime',\n driveningressWsUrl: 'wss://api.spatialwalk.top/v1/driveningress/websocket',\n },\n [Environment.us]: {\n sdkApiBaseUrl: 'https://api.spatialwalk.cloud',\n realtimeApiBaseUrl: 'https://enjoi.spatialwalk.cloud',\n realtimeWsUrl: 'wss://enjoi.spatialwalk.cloud/v1/realtime',\n driveningressWsUrl: 'wss://api.spatialwalk.cloud/v1/driveningress/websocket',\n },\n [Environment.test]: {\n sdkApiBaseUrl: 'https://api-test.spatialwalk.top',\n realtimeApiBaseUrl: 'https://enjoi-test.spatialwalk.top',\n realtimeWsUrl: 'wss://enjoi-test.spatialwalk.top/v1/realtime',\n driveningressWsUrl: 'wss://api-test.spatialwalk.top/v1/driveningress/websocket',\n },\n }\n\n const defaultConfig = defaultConfigs[this._configuration.environment]\n if (!defaultConfig) {\n throw new Error('Unknown environment')\n }\n\n // 如果已获取动态配置,使用动态配置的sdkApiBaseUrl,否则使用默认值\n const sdkApiBaseUrl = this._dynamicSdkConfig?.[this._configuration.environment] || defaultConfig.sdkApiBaseUrl\n\n return {\n sdkApiBaseUrl,\n realtimeApiBaseUrl: defaultConfig.realtimeApiBaseUrl,\n realtimeWsUrl: defaultConfig.realtimeWsUrl,\n driveningressWsUrl: defaultConfig.driveningressWsUrl,\n }\n }\n\n /**\n * 统一的 Telemetry 日志接口,对齐 iOS 版本的 SPAvatarSDK.log\n * 使用腾讯云 CLS 进行日志上报\n */\n static logEvent(\n event: string,\n level: 'debug' | 'info' | 'warning' | 'error' = 'info',\n contents: Record<string, unknown> = {},\n ): void {\n const context = {\n environment: this._configuration?.environment ?? 'unknown',\n sessionToken: this._sessionToken ?? '',\n userId: this._userId ?? '',\n sdkVersion: this._version,\n ...contents,\n }\n\n const logMethod = this._logLevels[level] ?? 'log'\n // @ts-expect-error dynamic method access\n logger[logMethod](`[Telemetry] ${event}`, context)\n\n // 上报到腾讯云 CLS\n trackEvent(event, level, context)\n }\n}\n","/**\n * 音频动画同步播放器\n * 支持 HTMLAudioElement(传统方式)和 StreamingAudioPlayer(流式播放)\n */\n\nimport type { StreamingAudioPlayer } from './StreamingAudioPlayer'\n\nimport { APP_CONFIG } from '../config/app-config'\nimport { AvatarKit } from '../core/AvatarKit'\nimport { logger } from '../utils/logger'\n\nexport class AnimationPlayer {\n private audio: HTMLAudioElement | null = null\n private streamingPlayer: StreamingAudioPlayer | null = null\n private _isPlaying = false\n private fps = APP_CONFIG.animation.fps\n private onEndedCallback?: () => void\n private static audioUnlocked = false\n private useStreaming = false\n\n /**\n * 解锁音频上下文(Safari 自动播放策略)\n * 必须在用户交互事件(如 click)中调用\n */\n static async unlockAudioContext(): Promise<void> {\n if (AnimationPlayer.audioUnlocked) {\n return\n }\n\n try {\n // 创建一个极短的静音音频并播放\n const silentAudio = new Audio()\n silentAudio.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA'\n silentAudio.volume = 0\n\n // 尝试播放以解锁音频上下文\n await silentAudio.play()\n\n // 立即停止\n silentAudio.pause()\n silentAudio.currentTime = 0\n\n AnimationPlayer.audioUnlocked = true\n logger.log('✅ Audio context unlocked for Safari')\n }\n catch (err) {\n logger.warn('⚠️ Failed to unlock audio context:', err)\n // 不抛出错误,让后续正常流程继续\n }\n }\n\n /**\n * Initialize with HTMLAudioElement (traditional way)\n */\n async initialize(audioUrl: string, onEnded?: () => void): Promise<void> {\n this.onEndedCallback = onEnded\n this.useStreaming = false\n\n return new Promise((resolve, reject) => {\n this.audio = new Audio(audioUrl)\n\n this.audio.addEventListener('canplaythrough', () => {\n this.setupEventListeners()\n resolve()\n }, { once: true })\n\n this.audio.addEventListener('error', () => {\n reject(new Error(`Failed to load audio: ${audioUrl}`))\n }, { once: true })\n\n this.audio.load()\n })\n }\n\n /**\n * Initialize with StreamingAudioPlayer (streaming way)\n * @deprecated 使用 prepareStreamingPlayer() 代替\n */\n async initializeStreaming(streamingPlayer: StreamingAudioPlayer, onEnded?: () => void): Promise<void> {\n this.streamingPlayer = streamingPlayer\n this.onEndedCallback = onEnded\n this.useStreaming = true\n\n // Set ended callback on streaming player\n this.streamingPlayer.onEnded(() => {\n this._isPlaying = false\n this.onEndedCallback?.()\n })\n }\n\n /**\n * 检查流式播放器是否已准备好\n */\n isStreamingReady(): boolean {\n return this.useStreaming && this.streamingPlayer !== null\n }\n\n /**\n * 获取流式播放器实例\n */\n getStreamingPlayer(): StreamingAudioPlayer | null {\n return this.streamingPlayer\n }\n\n /**\n * 创建并初始化流式播放器\n * 在服务连接建立时调用\n */\n async createAndInitializeStreamingPlayer(): Promise<void> {\n if (this.streamingPlayer) {\n // 已创建,直接返回\n return\n }\n\n const { StreamingAudioPlayer } = await import('./StreamingAudioPlayer')\n this.streamingPlayer = new StreamingAudioPlayer({\n sampleRate: APP_CONFIG.audio.sampleRate,\n channelCount: 1,\n debug: false,\n })\n try {\n await this.streamingPlayer.initialize()\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AnimationPlayer] Failed to initialize streaming player:', message)\n AvatarKit.logEvent('character_player', 'error', {\n event: 'streaming_player_initialize_failed',\n reason: message,\n })\n throw error\n }\n this.useStreaming = true\n }\n\n /**\n * 准备流式播放器(如果未创建则创建并初始化)\n * 停止之前的播放并更新结束回调\n */\n async prepareStreamingPlayer(onEnded?: () => void): Promise<void> {\n if (!this.streamingPlayer) {\n // 如果播放器未创建,创建并初始化\n await this.createAndInitializeStreamingPlayer()\n }\n\n if (!this.streamingPlayer) {\n throw new Error('Failed to create streaming player')\n }\n\n // 停止之前的播放并更新回调\n this.streamingPlayer.stop()\n this.onEndedCallback = onEnded\n this.streamingPlayer.onEnded(() => {\n this._isPlaying = false\n this.onEndedCallback?.()\n })\n }\n\n private setupEventListeners(): void {\n if (!this.audio)\n return\n\n this.audio.addEventListener('play', () => {\n this._isPlaying = true\n })\n\n this.audio.addEventListener('ended', () => {\n this._isPlaying = false\n this.onEndedCallback?.()\n })\n\n }\n\n async play(): Promise<void> {\n if (this.useStreaming) {\n // Streaming mode: just mark as playing (chunks will auto-play)\n this._isPlaying = true\n }\n else {\n // Traditional mode\n if (!this.audio)\n throw new Error('Audio not loaded')\n this.audio.currentTime = 0\n await this.audio.play()\n }\n }\n\n stop(): void {\n this._isPlaying = false\n\n if (this.useStreaming) {\n this.streamingPlayer?.stop()\n }\n else {\n if (this.audio) {\n this.audio.pause()\n this.audio.currentTime = 0\n }\n }\n }\n\n isPlaying(): boolean {\n if (this.useStreaming) {\n return this._isPlaying && this.streamingPlayer?.isPlayingNow() === true\n }\n return this._isPlaying\n }\n\n getCurrentFrameIndex(): number {\n const currentTime = this.getCurrentTime()\n return Math.floor(currentTime * this.fps)\n }\n\n /**\n * Get current playback time\n */\n getCurrentTime(): number {\n if (this.useStreaming) {\n return this.streamingPlayer?.getCurrentTime() ?? 0\n }\n return this.audio?.currentTime ?? 0\n }\n\n /**\n * 添加音频块(仅用于流式播放)\n */\n addAudioChunk(audio: Uint8Array, isLast: boolean = false): void {\n if (this.useStreaming && this.streamingPlayer) {\n this.streamingPlayer.addChunk(audio, isLast)\n } else {\n logger.warn('[AnimationPlayer] Cannot add audio chunk - streaming player not ready')\n }\n }\n\n dispose(): void {\n this.stop()\n\n if (this.audio) {\n this.audio.src = ''\n this.audio = null\n }\n\n if (this.streamingPlayer) {\n this.streamingPlayer.dispose()\n this.streamingPlayer = null\n }\n\n this.onEndedCallback = undefined\n }\n}\n","// Copyright 2008 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Code generated by the Protocol Buffer compiler is owned by the owner\n// of the input file used when generating it. This code is not\n// standalone and requires a support library to be linked with it. This\n// support library is itself covered by the above license.\n/**\n * Read a 64 bit varint as two JS numbers.\n *\n * Returns tuple:\n * [0]: low bits\n * [1]: high bits\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175\n */\nexport function varint64read() {\n let lowBits = 0;\n let highBits = 0;\n for (let shift = 0; shift < 28; shift += 7) {\n let b = this.buf[this.pos++];\n lowBits |= (b & 0x7f) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n let middleByte = this.buf[this.pos++];\n // last four bits of the first 32 bit number\n lowBits |= (middleByte & 0x0f) << 28;\n // 3 upper bits are part of the next 32 bit number\n highBits = (middleByte & 0x70) >> 4;\n if ((middleByte & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n for (let shift = 3; shift <= 31; shift += 7) {\n let b = this.buf[this.pos++];\n highBits |= (b & 0x7f) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n throw new Error(\"invalid varint\");\n}\n/**\n * Write a 64 bit varint, given as two JS numbers, to the given bytes array.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344\n */\nexport function varint64write(lo, hi, bytes) {\n for (let i = 0; i < 28; i = i + 7) {\n const shift = lo >>> i;\n const hasNext = !(shift >>> 7 == 0 && hi == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xff;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n const splitBits = ((lo >>> 28) & 0x0f) | ((hi & 0x07) << 4);\n const hasMoreBits = !(hi >> 3 == 0);\n bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xff);\n if (!hasMoreBits) {\n return;\n }\n for (let i = 3; i < 31; i = i + 7) {\n const shift = hi >>> i;\n const hasNext = !(shift >>> 7 == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xff;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n bytes.push((hi >>> 31) & 0x01);\n}\n// constants for binary math\nconst TWO_PWR_32_DBL = 0x100000000;\n/**\n * Parse decimal string of 64 bit integer value as two JS numbers.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function int64FromString(dec) {\n // Check for minus sign.\n const minus = dec[0] === \"-\";\n if (minus) {\n dec = dec.slice(1);\n }\n // Work 6 decimal digits at a time, acting like we're converting base 1e6\n // digits to binary. This is safe to do with floating point math because\n // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.\n const base = 1e6;\n let lowBits = 0;\n let highBits = 0;\n function add1e6digit(begin, end) {\n // Note: Number('') is 0.\n const digit1e6 = Number(dec.slice(begin, end));\n highBits *= base;\n lowBits = lowBits * base + digit1e6;\n // Carry bits from lowBits to\n if (lowBits >= TWO_PWR_32_DBL) {\n highBits = highBits + ((lowBits / TWO_PWR_32_DBL) | 0);\n lowBits = lowBits % TWO_PWR_32_DBL;\n }\n }\n add1e6digit(-24, -18);\n add1e6digit(-18, -12);\n add1e6digit(-12, -6);\n add1e6digit(-6);\n return minus ? negate(lowBits, highBits) : newBits(lowBits, highBits);\n}\n/**\n * Losslessly converts a 64-bit signed integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function int64ToString(lo, hi) {\n let bits = newBits(lo, hi);\n // If we're treating the input as a signed value and the high bit is set, do\n // a manual two's complement conversion before the decimal conversion.\n const negative = bits.hi & 0x80000000;\n if (negative) {\n bits = negate(bits.lo, bits.hi);\n }\n const result = uInt64ToString(bits.lo, bits.hi);\n return negative ? \"-\" + result : result;\n}\n/**\n * Losslessly converts a 64-bit unsigned integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function uInt64ToString(lo, hi) {\n ({ lo, hi } = toUnsigned(lo, hi));\n // Skip the expensive conversion if the number is small enough to use the\n // built-in conversions.\n // Number.MAX_SAFE_INTEGER = 0x001FFFFF FFFFFFFF, thus any number with\n // highBits <= 0x1FFFFF can be safely expressed with a double and retain\n // integer precision.\n // Proven by: Number.isSafeInteger(0x1FFFFF * 2**32 + 0xFFFFFFFF) == true.\n if (hi <= 0x1fffff) {\n return String(TWO_PWR_32_DBL * hi + lo);\n }\n // What this code is doing is essentially converting the input number from\n // base-2 to base-1e7, which allows us to represent the 64-bit range with\n // only 3 (very large) digits. Those digits are then trivial to convert to\n // a base-10 string.\n // The magic numbers used here are -\n // 2^24 = 16777216 = (1,6777216) in base-1e7.\n // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.\n // Split 32:32 representation into 16:24:24 representation so our\n // intermediate digits don't overflow.\n const low = lo & 0xffffff;\n const mid = ((lo >>> 24) | (hi << 8)) & 0xffffff;\n const high = (hi >> 16) & 0xffff;\n // Assemble our three base-1e7 digits, ignoring carries. The maximum\n // value in a digit at this step is representable as a 48-bit integer, which\n // can be stored in a 64-bit floating point number.\n let digitA = low + mid * 6777216 + high * 6710656;\n let digitB = mid + high * 8147497;\n let digitC = high * 2;\n // Apply carries from A to B and from B to C.\n const base = 10000000;\n if (digitA >= base) {\n digitB += Math.floor(digitA / base);\n digitA %= base;\n }\n if (digitB >= base) {\n digitC += Math.floor(digitB / base);\n digitB %= base;\n }\n // If digitC is 0, then we should have returned in the trivial code path\n // at the top for non-safe integers. Given this, we can assume both digitB\n // and digitA need leading zeros.\n return (digitC.toString() +\n decimalFrom1e7WithLeadingZeros(digitB) +\n decimalFrom1e7WithLeadingZeros(digitA));\n}\nfunction toUnsigned(lo, hi) {\n return { lo: lo >>> 0, hi: hi >>> 0 };\n}\nfunction newBits(lo, hi) {\n return { lo: lo | 0, hi: hi | 0 };\n}\n/**\n * Returns two's compliment negation of input.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Signed_32-bit_integers\n */\nfunction negate(lowBits, highBits) {\n highBits = ~highBits;\n if (lowBits) {\n lowBits = ~lowBits + 1;\n }\n else {\n // If lowBits is 0, then bitwise-not is 0xFFFFFFFF,\n // adding 1 to that, results in 0x100000000, which leaves\n // the low bits 0x0 and simply adds one to the high bits.\n highBits += 1;\n }\n return newBits(lowBits, highBits);\n}\n/**\n * Returns decimal representation of digit1e7 with leading zeros.\n */\nconst decimalFrom1e7WithLeadingZeros = (digit1e7) => {\n const partial = String(digit1e7);\n return \"0000000\".slice(partial.length) + partial;\n};\n/**\n * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144\n */\nexport function varint32write(value, bytes) {\n if (value >= 0) {\n // write value as varint 32\n while (value > 0x7f) {\n bytes.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n bytes.push(value);\n }\n else {\n for (let i = 0; i < 9; i++) {\n bytes.push((value & 127) | 128);\n value = value >> 7;\n }\n bytes.push(1);\n }\n}\n/**\n * Read an unsigned 32 bit varint.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220\n */\nexport function varint32read() {\n let b = this.buf[this.pos++];\n let result = b & 0x7f;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 7;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 14;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 21;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n // Extract only last 4 bits\n b = this.buf[this.pos++];\n result |= (b & 0x0f) << 28;\n for (let readBytes = 5; (b & 0x80) !== 0 && readBytes < 10; readBytes++)\n b = this.buf[this.pos++];\n if ((b & 0x80) != 0)\n throw new Error(\"invalid varint\");\n this.assertBounds();\n // Result can have 32 bits, convert it to unsigned\n return result >>> 0;\n}\n","// Copyright 2021-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { int64FromString, int64ToString, uInt64ToString, } from \"./wire/varint.js\";\n/**\n * Int64Support for the current environment.\n */\nexport const protoInt64 = /*@__PURE__*/ makeInt64Support();\nfunction makeInt64Support() {\n const dv = new DataView(new ArrayBuffer(8));\n // note that Safari 14 implements BigInt, but not the DataView methods\n const ok = typeof BigInt === \"function\" &&\n typeof dv.getBigInt64 === \"function\" &&\n typeof dv.getBigUint64 === \"function\" &&\n typeof dv.setBigInt64 === \"function\" &&\n typeof dv.setBigUint64 === \"function\" &&\n (!!globalThis.Deno ||\n typeof process != \"object\" ||\n typeof process.env != \"object\" ||\n process.env.BUF_BIGINT_DISABLE !== \"1\");\n if (ok) {\n const MIN = BigInt(\"-9223372036854775808\");\n const MAX = BigInt(\"9223372036854775807\");\n const UMIN = BigInt(\"0\");\n const UMAX = BigInt(\"18446744073709551615\");\n return {\n zero: BigInt(0),\n supported: true,\n parse(value) {\n const bi = typeof value == \"bigint\" ? value : BigInt(value);\n if (bi > MAX || bi < MIN) {\n throw new Error(`invalid int64: ${value}`);\n }\n return bi;\n },\n uParse(value) {\n const bi = typeof value == \"bigint\" ? value : BigInt(value);\n if (bi > UMAX || bi < UMIN) {\n throw new Error(`invalid uint64: ${value}`);\n }\n return bi;\n },\n enc(value) {\n dv.setBigInt64(0, this.parse(value), true);\n return {\n lo: dv.getInt32(0, true),\n hi: dv.getInt32(4, true),\n };\n },\n uEnc(value) {\n dv.setBigInt64(0, this.uParse(value), true);\n return {\n lo: dv.getInt32(0, true),\n hi: dv.getInt32(4, true),\n };\n },\n dec(lo, hi) {\n dv.setInt32(0, lo, true);\n dv.setInt32(4, hi, true);\n return dv.getBigInt64(0, true);\n },\n uDec(lo, hi) {\n dv.setInt32(0, lo, true);\n dv.setInt32(4, hi, true);\n return dv.getBigUint64(0, true);\n },\n };\n }\n return {\n zero: \"0\",\n supported: false,\n parse(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertInt64String(value);\n return value;\n },\n uParse(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertUInt64String(value);\n return value;\n },\n enc(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertInt64String(value);\n return int64FromString(value);\n },\n uEnc(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertUInt64String(value);\n return int64FromString(value);\n },\n dec(lo, hi) {\n return int64ToString(lo, hi);\n },\n uDec(lo, hi) {\n return uInt64ToString(lo, hi);\n },\n };\n}\nfunction assertInt64String(value) {\n if (!/^-?[0-9]+$/.test(value)) {\n throw new Error(\"invalid int64: \" + value);\n }\n}\nfunction assertUInt64String(value) {\n if (!/^[0-9]+$/.test(value)) {\n throw new Error(\"invalid uint64: \" + value);\n }\n}\n","// Copyright 2021-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nconst symbol = Symbol.for(\"@bufbuild/protobuf/text-encoding\");\n/**\n * Protobuf-ES requires the Text Encoding API to convert UTF-8 from and to\n * binary. This WHATWG API is widely available, but it is not part of the\n * ECMAScript standard. On runtimes where it is not available, use this\n * function to provide your own implementation.\n *\n * Note that the Text Encoding API does not provide a way to validate UTF-8.\n * Our implementation falls back to use encodeURIComponent().\n */\nexport function configureTextEncoding(textEncoding) {\n globalThis[symbol] = textEncoding;\n}\nexport function getTextEncoding() {\n if (globalThis[symbol] == undefined) {\n const te = new globalThis.TextEncoder();\n const td = new globalThis.TextDecoder();\n globalThis[symbol] = {\n encodeUtf8(text) {\n return te.encode(text);\n },\n decodeUtf8(bytes) {\n return td.decode(bytes);\n },\n checkUtf8(text) {\n try {\n encodeURIComponent(text);\n return true;\n }\n catch (_) {\n return false;\n }\n },\n };\n }\n return globalThis[symbol];\n}\n","// Copyright 2021-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { varint32read, varint32write, varint64read, varint64write, } from \"./varint.js\";\nimport { protoInt64 } from \"../proto-int64.js\";\nimport { getTextEncoding } from \"./text-encoding.js\";\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nexport var WireType;\n(function (WireType) {\n /**\n * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n */\n WireType[WireType[\"Varint\"] = 0] = \"Varint\";\n /**\n * Used for fixed64, sfixed64, double.\n * Always 8 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit64\"] = 1] = \"Bit64\";\n /**\n * Used for string, bytes, embedded messages, packed repeated fields\n *\n * Only repeated numeric types (types which use the varint, 32-bit,\n * or 64-bit wire types) can be packed. In proto3, such fields are\n * packed by default.\n */\n WireType[WireType[\"LengthDelimited\"] = 2] = \"LengthDelimited\";\n /**\n * Start of a tag-delimited aggregate, such as a proto2 group, or a message\n * in editions with message_encoding = DELIMITED.\n */\n WireType[WireType[\"StartGroup\"] = 3] = \"StartGroup\";\n /**\n * End of a tag-delimited aggregate.\n */\n WireType[WireType[\"EndGroup\"] = 4] = \"EndGroup\";\n /**\n * Used for fixed32, sfixed32, float.\n * Always 4 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit32\"] = 5] = \"Bit32\";\n})(WireType || (WireType = {}));\n/**\n * Maximum value for a 32-bit floating point value (Protobuf FLOAT).\n */\nexport const FLOAT32_MAX = 3.4028234663852886e38;\n/**\n * Minimum value for a 32-bit floating point value (Protobuf FLOAT).\n */\nexport const FLOAT32_MIN = -3.4028234663852886e38;\n/**\n * Maximum value for an unsigned 32-bit integer (Protobuf UINT32, FIXED32).\n */\nexport const UINT32_MAX = 0xffffffff;\n/**\n * Maximum value for a signed 32-bit integer (Protobuf INT32, SFIXED32, SINT32).\n */\nexport const INT32_MAX = 0x7fffffff;\n/**\n * Minimum value for a signed 32-bit integer (Protobuf INT32, SFIXED32, SINT32).\n */\nexport const INT32_MIN = -0x80000000;\nexport class BinaryWriter {\n constructor(encodeUtf8 = getTextEncoding().encodeUtf8) {\n this.encodeUtf8 = encodeUtf8;\n /**\n * Previous fork states.\n */\n this.stack = [];\n this.chunks = [];\n this.buf = [];\n }\n /**\n * Return all bytes written and reset this writer.\n */\n finish() {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n this.buf = [];\n }\n let len = 0;\n for (let i = 0; i < this.chunks.length; i++)\n len += this.chunks[i].length;\n let bytes = new Uint8Array(len);\n let offset = 0;\n for (let i = 0; i < this.chunks.length; i++) {\n bytes.set(this.chunks[i], offset);\n offset += this.chunks[i].length;\n }\n this.chunks = [];\n return bytes;\n }\n /**\n * Start a new fork for length-delimited data like a message\n * or a packed repeated field.\n *\n * Must be joined later with `join()`.\n */\n fork() {\n this.stack.push({ chunks: this.chunks, buf: this.buf });\n this.chunks = [];\n this.buf = [];\n return this;\n }\n /**\n * Join the last fork. Write its length and bytes, then\n * return to the previous state.\n */\n join() {\n // get chunk of fork\n let chunk = this.finish();\n // restore previous state\n let prev = this.stack.pop();\n if (!prev)\n throw new Error(\"invalid state, fork stack empty\");\n this.chunks = prev.chunks;\n this.buf = prev.buf;\n // write length of chunk as varint\n this.uint32(chunk.byteLength);\n return this.raw(chunk);\n }\n /**\n * Writes a tag (field number and wire type).\n *\n * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.\n *\n * Generated code should compute the tag ahead of time and call `uint32()`.\n */\n tag(fieldNo, type) {\n return this.uint32(((fieldNo << 3) | type) >>> 0);\n }\n /**\n * Write a chunk of raw bytes.\n */\n raw(chunk) {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf));\n this.buf = [];\n }\n this.chunks.push(chunk);\n return this;\n }\n /**\n * Write a `uint32` value, an unsigned 32 bit varint.\n */\n uint32(value) {\n assertUInt32(value);\n // write value as varint 32, inlined for speed\n while (value > 0x7f) {\n this.buf.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n this.buf.push(value);\n return this;\n }\n /**\n * Write a `int32` value, a signed 32 bit varint.\n */\n int32(value) {\n assertInt32(value);\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `bool` value, a variant.\n */\n bool(value) {\n this.buf.push(value ? 1 : 0);\n return this;\n }\n /**\n * Write a `bytes` value, length-delimited arbitrary data.\n */\n bytes(value) {\n this.uint32(value.byteLength); // write length of chunk as varint\n return this.raw(value);\n }\n /**\n * Write a `string` value, length-delimited data converted to UTF-8 text.\n */\n string(value) {\n let chunk = this.encodeUtf8(value);\n this.uint32(chunk.byteLength); // write length of chunk as varint\n return this.raw(chunk);\n }\n /**\n * Write a `float` value, 32-bit floating point number.\n */\n float(value) {\n assertFloat32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setFloat32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `double` value, a 64-bit floating point number.\n */\n double(value) {\n let chunk = new Uint8Array(8);\n new DataView(chunk.buffer).setFloat64(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n */\n fixed32(value) {\n assertUInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setUint32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n */\n sfixed32(value) {\n assertInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setInt32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n */\n sint32(value) {\n assertInt32(value);\n // zigzag encode\n value = ((value << 1) ^ (value >> 31)) >>> 0;\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n */\n sfixed64(value) {\n let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.enc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n */\n fixed64(value) {\n let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.uEnc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `int64` value, a signed 64-bit varint.\n */\n int64(value) {\n let tc = protoInt64.enc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n /**\n * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64(value) {\n const tc = protoInt64.enc(value), \n // zigzag encode\n sign = tc.hi >> 31, lo = (tc.lo << 1) ^ sign, hi = ((tc.hi << 1) | (tc.lo >>> 31)) ^ sign;\n varint64write(lo, hi, this.buf);\n return this;\n }\n /**\n * Write a `uint64` value, an unsigned 64-bit varint.\n */\n uint64(value) {\n const tc = protoInt64.uEnc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n}\nexport class BinaryReader {\n constructor(buf, decodeUtf8 = getTextEncoding().decodeUtf8) {\n this.decodeUtf8 = decodeUtf8;\n this.varint64 = varint64read; // dirty cast for `this`\n /**\n * Read a `uint32` field, an unsigned 32 bit varint.\n */\n this.uint32 = varint32read;\n this.buf = buf;\n this.len = buf.length;\n this.pos = 0;\n this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n /**\n * Reads a tag - field number and wire type.\n */\n tag() {\n let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;\n if (fieldNo <= 0 || wireType < 0 || wireType > 5)\n throw new Error(\"illegal tag: field no \" + fieldNo + \" wire type \" + wireType);\n return [fieldNo, wireType];\n }\n /**\n * Skip one element and return the skipped data.\n *\n * When skipping StartGroup, provide the tags field number to check for\n * matching field number in the EndGroup tag.\n */\n skip(wireType, fieldNo) {\n let start = this.pos;\n switch (wireType) {\n case WireType.Varint:\n while (this.buf[this.pos++] & 0x80) {\n // ignore\n }\n break;\n // @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true\n case WireType.Bit64:\n this.pos += 4;\n case WireType.Bit32:\n this.pos += 4;\n break;\n case WireType.LengthDelimited:\n let len = this.uint32();\n this.pos += len;\n break;\n case WireType.StartGroup:\n for (;;) {\n const [fn, wt] = this.tag();\n if (wt === WireType.EndGroup) {\n if (fieldNo !== undefined && fn !== fieldNo) {\n throw new Error(\"invalid end group tag\");\n }\n break;\n }\n this.skip(wt, fn);\n }\n break;\n default:\n throw new Error(\"cant skip wire type \" + wireType);\n }\n this.assertBounds();\n return this.buf.subarray(start, this.pos);\n }\n /**\n * Throws error if position in byte array is out of range.\n */\n assertBounds() {\n if (this.pos > this.len)\n throw new RangeError(\"premature EOF\");\n }\n /**\n * Read a `int32` field, a signed 32 bit varint.\n */\n int32() {\n return this.uint32() | 0;\n }\n /**\n * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n */\n sint32() {\n let zze = this.uint32();\n // decode zigzag\n return (zze >>> 1) ^ -(zze & 1);\n }\n /**\n * Read a `int64` field, a signed 64-bit varint.\n */\n int64() {\n return protoInt64.dec(...this.varint64());\n }\n /**\n * Read a `uint64` field, an unsigned 64-bit varint.\n */\n uint64() {\n return protoInt64.uDec(...this.varint64());\n }\n /**\n * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64() {\n let [lo, hi] = this.varint64();\n // decode zig zag\n let s = -(lo & 1);\n lo = ((lo >>> 1) | ((hi & 1) << 31)) ^ s;\n hi = (hi >>> 1) ^ s;\n return protoInt64.dec(lo, hi);\n }\n /**\n * Read a `bool` field, a variant.\n */\n bool() {\n let [lo, hi] = this.varint64();\n return lo !== 0 || hi !== 0;\n }\n /**\n * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n */\n fixed32() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getUint32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n */\n sfixed32() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getInt32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n */\n fixed64() {\n return protoInt64.uDec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n */\n sfixed64() {\n return protoInt64.dec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `float` field, 32-bit floating point number.\n */\n float() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getFloat32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `double` field, a 64-bit floating point number.\n */\n double() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getFloat64((this.pos += 8) - 8, true);\n }\n /**\n * Read a `bytes` field, length-delimited arbitrary data.\n */\n bytes() {\n let len = this.uint32(), start = this.pos;\n this.pos += len;\n this.assertBounds();\n return this.buf.subarray(start, start + len);\n }\n /**\n * Read a `string` field, length-delimited data converted to UTF-8 text.\n */\n string() {\n return this.decodeUtf8(this.bytes());\n }\n}\n/**\n * Assert a valid signed protobuf 32-bit integer as a number or string.\n */\nfunction assertInt32(arg) {\n if (typeof arg == \"string\") {\n arg = Number(arg);\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid int32: \" + typeof arg);\n }\n if (!Number.isInteger(arg) ||\n arg > INT32_MAX ||\n arg < INT32_MIN)\n throw new Error(\"invalid int32: \" + arg);\n}\n/**\n * Assert a valid unsigned protobuf 32-bit integer as a number or string.\n */\nfunction assertUInt32(arg) {\n if (typeof arg == \"string\") {\n arg = Number(arg);\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid uint32: \" + typeof arg);\n }\n if (!Number.isInteger(arg) ||\n arg > UINT32_MAX ||\n arg < 0)\n throw new Error(\"invalid uint32: \" + arg);\n}\n/**\n * Assert a valid protobuf float value as a number or string.\n */\nfunction assertFloat32(arg) {\n if (typeof arg == \"string\") {\n const o = arg;\n arg = Number(arg);\n if (Number.isNaN(arg) && o !== \"NaN\") {\n throw new Error(\"invalid float32: \" + o);\n }\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid float32: \" + typeof arg);\n }\n if (Number.isFinite(arg) &&\n (arg > FLOAT32_MAX || arg < FLOAT32_MIN))\n throw new Error(\"invalid float32: \" + arg);\n}\n","// Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n// versions:\n// protoc-gen-ts_proto v2.6.1\n// protoc unknown\n// source: driveningress/v1/driveningress.proto\n\n/* eslint-disable */\nimport { BinaryReader, BinaryWriter } from \"@bufbuild/protobuf/wire\";\n\nexport const protobufPackage = \"driveningress.v1\";\n\nexport enum MessageType {\n MESSAGE_UNSPECIFIED = 0,\n MESSAGE_ERROR = 2,\n MESSAGE_SERVER_RESPONSE_ANIMATION = 1004,\n MESSAGE_CLIENT_AUDIO_INPUT = 2003,\n UNRECOGNIZED = -1,\n}\n\nexport function messageTypeFromJSON(object: any): MessageType {\n switch (object) {\n case 0:\n case \"MESSAGE_UNSPECIFIED\":\n return MessageType.MESSAGE_UNSPECIFIED;\n case 2:\n case \"MESSAGE_ERROR\":\n return MessageType.MESSAGE_ERROR;\n case 1004:\n case \"MESSAGE_SERVER_RESPONSE_ANIMATION\":\n return MessageType.MESSAGE_SERVER_RESPONSE_ANIMATION;\n case 2003:\n case \"MESSAGE_CLIENT_AUDIO_INPUT\":\n return MessageType.MESSAGE_CLIENT_AUDIO_INPUT;\n case -1:\n case \"UNRECOGNIZED\":\n default:\n return MessageType.UNRECOGNIZED;\n }\n}\n\nexport function messageTypeToJSON(object: MessageType): string {\n switch (object) {\n case MessageType.MESSAGE_UNSPECIFIED:\n return \"MESSAGE_UNSPECIFIED\";\n case MessageType.MESSAGE_ERROR:\n return \"MESSAGE_ERROR\";\n case MessageType.MESSAGE_SERVER_RESPONSE_ANIMATION:\n return \"MESSAGE_SERVER_RESPONSE_ANIMATION\";\n case MessageType.MESSAGE_CLIENT_AUDIO_INPUT:\n return \"MESSAGE_CLIENT_AUDIO_INPUT\";\n case MessageType.UNRECOGNIZED:\n default:\n return \"UNRECOGNIZED\";\n }\n}\n\n/**\n * 兼容流式传输,只要 req_id 相同,客户端可以将音频分段发若干个 ClientAudioInputData\n * 新 req_id 出现后,老 req_id 的请求将被忽略\n */\nexport interface ClientAudioInputData {\n reqId: string;\n audio: Uint8Array;\n end: boolean;\n}\n\nexport interface Flame {\n /** 平移 */\n translation: number[];\n /** 旋转 */\n rotation: number[];\n /** 脖子 */\n neckPose: number[];\n /** 下巴 */\n jawPose: number[];\n /** 眼睛 */\n eyePose: number[];\n /** 眼皮 */\n eyeLid: number[];\n /** 表情参数 */\n expression: number[];\n}\n\nexport interface FlameAnimation {\n keyframes: Flame[];\n}\n\nexport interface ServerResponseAnimationData {\n reqId: string;\n animation?: FlameAnimation | undefined;\n}\n\nexport interface ErrorInfo {\n reqId: string;\n code: number;\n reason: string;\n}\n\nexport interface Message {\n type: MessageType;\n error?: ErrorInfo | undefined;\n serverResponseAnimation?: ServerResponseAnimationData | undefined;\n clientAudioInput?: ClientAudioInputData | undefined;\n}\n\nfunction createBaseClientAudioInputData(): ClientAudioInputData {\n return { reqId: \"\", audio: new Uint8Array(0), end: false };\n}\n\nexport const ClientAudioInputData: MessageFns<ClientAudioInputData> = {\n encode(message: ClientAudioInputData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n if (message.reqId !== \"\") {\n writer.uint32(10).string(message.reqId);\n }\n if (message.audio.length !== 0) {\n writer.uint32(18).bytes(message.audio);\n }\n if (message.end !== false) {\n writer.uint32(24).bool(message.end);\n }\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): ClientAudioInputData {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseClientAudioInputData();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (tag !== 10) {\n break;\n }\n\n message.reqId = reader.string();\n continue;\n }\n case 2: {\n if (tag !== 18) {\n break;\n }\n\n message.audio = reader.bytes();\n continue;\n }\n case 3: {\n if (tag !== 24) {\n break;\n }\n\n message.end = reader.bool();\n continue;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ClientAudioInputData {\n return {\n reqId: isSet(object.reqId) ? globalThis.String(object.reqId) : \"\",\n audio: isSet(object.audio) ? bytesFromBase64(object.audio) : new Uint8Array(0),\n end: isSet(object.end) ? globalThis.Boolean(object.end) : false,\n };\n },\n\n toJSON(message: ClientAudioInputData): unknown {\n const obj: any = {};\n if (message.reqId !== \"\") {\n obj.reqId = message.reqId;\n }\n if (message.audio.length !== 0) {\n obj.audio = base64FromBytes(message.audio);\n }\n if (message.end !== false) {\n obj.end = message.end;\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<ClientAudioInputData>, I>>(base?: I): ClientAudioInputData {\n return ClientAudioInputData.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<ClientAudioInputData>, I>>(object: I): ClientAudioInputData {\n const message = createBaseClientAudioInputData();\n message.reqId = object.reqId ?? \"\";\n message.audio = object.audio ?? new Uint8Array(0);\n message.end = object.end ?? false;\n return message;\n },\n};\n\nfunction createBaseFlame(): Flame {\n return { translation: [], rotation: [], neckPose: [], jawPose: [], eyePose: [], eyeLid: [], expression: [] };\n}\n\nexport const Flame: MessageFns<Flame> = {\n encode(message: Flame, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n writer.uint32(18).fork();\n for (const v of message.translation) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(26).fork();\n for (const v of message.rotation) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(34).fork();\n for (const v of message.neckPose) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(42).fork();\n for (const v of message.jawPose) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(50).fork();\n for (const v of message.eyePose) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(58).fork();\n for (const v of message.eyeLid) {\n writer.float(v);\n }\n writer.join();\n writer.uint32(66).fork();\n for (const v of message.expression) {\n writer.float(v);\n }\n writer.join();\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): Flame {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseFlame();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 2: {\n if (tag === 21) {\n message.translation.push(reader.float());\n\n continue;\n }\n\n if (tag === 18) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.translation.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 3: {\n if (tag === 29) {\n message.rotation.push(reader.float());\n\n continue;\n }\n\n if (tag === 26) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.rotation.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 4: {\n if (tag === 37) {\n message.neckPose.push(reader.float());\n\n continue;\n }\n\n if (tag === 34) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.neckPose.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 5: {\n if (tag === 45) {\n message.jawPose.push(reader.float());\n\n continue;\n }\n\n if (tag === 42) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.jawPose.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 6: {\n if (tag === 53) {\n message.eyePose.push(reader.float());\n\n continue;\n }\n\n if (tag === 50) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.eyePose.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 7: {\n if (tag === 61) {\n message.eyeLid.push(reader.float());\n\n continue;\n }\n\n if (tag === 58) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.eyeLid.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n case 8: {\n if (tag === 69) {\n message.expression.push(reader.float());\n\n continue;\n }\n\n if (tag === 66) {\n const end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2) {\n message.expression.push(reader.float());\n }\n\n continue;\n }\n\n break;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): Flame {\n return {\n translation: globalThis.Array.isArray(object?.translation)\n ? object.translation.map((e: any) => globalThis.Number(e))\n : [],\n rotation: globalThis.Array.isArray(object?.rotation) ? object.rotation.map((e: any) => globalThis.Number(e)) : [],\n neckPose: globalThis.Array.isArray(object?.neckPose) ? object.neckPose.map((e: any) => globalThis.Number(e)) : [],\n jawPose: globalThis.Array.isArray(object?.jawPose) ? object.jawPose.map((e: any) => globalThis.Number(e)) : [],\n eyePose: globalThis.Array.isArray(object?.eyePose) ? object.eyePose.map((e: any) => globalThis.Number(e)) : [],\n eyeLid: globalThis.Array.isArray(object?.eyeLid) ? object.eyeLid.map((e: any) => globalThis.Number(e)) : [],\n expression: globalThis.Array.isArray(object?.expression)\n ? object.expression.map((e: any) => globalThis.Number(e))\n : [],\n };\n },\n\n toJSON(message: Flame): unknown {\n const obj: any = {};\n if (message.translation?.length) {\n obj.translation = message.translation;\n }\n if (message.rotation?.length) {\n obj.rotation = message.rotation;\n }\n if (message.neckPose?.length) {\n obj.neckPose = message.neckPose;\n }\n if (message.jawPose?.length) {\n obj.jawPose = message.jawPose;\n }\n if (message.eyePose?.length) {\n obj.eyePose = message.eyePose;\n }\n if (message.eyeLid?.length) {\n obj.eyeLid = message.eyeLid;\n }\n if (message.expression?.length) {\n obj.expression = message.expression;\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<Flame>, I>>(base?: I): Flame {\n return Flame.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<Flame>, I>>(object: I): Flame {\n const message = createBaseFlame();\n message.translation = object.translation?.map((e) => e) || [];\n message.rotation = object.rotation?.map((e) => e) || [];\n message.neckPose = object.neckPose?.map((e) => e) || [];\n message.jawPose = object.jawPose?.map((e) => e) || [];\n message.eyePose = object.eyePose?.map((e) => e) || [];\n message.eyeLid = object.eyeLid?.map((e) => e) || [];\n message.expression = object.expression?.map((e) => e) || [];\n return message;\n },\n};\n\nfunction createBaseFlameAnimation(): FlameAnimation {\n return { keyframes: [] };\n}\n\nexport const FlameAnimation: MessageFns<FlameAnimation> = {\n encode(message: FlameAnimation, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n for (const v of message.keyframes) {\n Flame.encode(v!, writer.uint32(10).fork()).join();\n }\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): FlameAnimation {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseFlameAnimation();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (tag !== 10) {\n break;\n }\n\n message.keyframes.push(Flame.decode(reader, reader.uint32()));\n continue;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): FlameAnimation {\n return {\n keyframes: globalThis.Array.isArray(object?.keyframes) ? object.keyframes.map((e: any) => Flame.fromJSON(e)) : [],\n };\n },\n\n toJSON(message: FlameAnimation): unknown {\n const obj: any = {};\n if (message.keyframes?.length) {\n obj.keyframes = message.keyframes.map((e) => Flame.toJSON(e));\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<FlameAnimation>, I>>(base?: I): FlameAnimation {\n return FlameAnimation.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<FlameAnimation>, I>>(object: I): FlameAnimation {\n const message = createBaseFlameAnimation();\n message.keyframes = object.keyframes?.map((e) => Flame.fromPartial(e)) || [];\n return message;\n },\n};\n\nfunction createBaseServerResponseAnimationData(): ServerResponseAnimationData {\n return { reqId: \"\", animation: undefined };\n}\n\nexport const ServerResponseAnimationData: MessageFns<ServerResponseAnimationData> = {\n encode(message: ServerResponseAnimationData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n if (message.reqId !== \"\") {\n writer.uint32(10).string(message.reqId);\n }\n if (message.animation !== undefined) {\n FlameAnimation.encode(message.animation, writer.uint32(18).fork()).join();\n }\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): ServerResponseAnimationData {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseServerResponseAnimationData();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (tag !== 10) {\n break;\n }\n\n message.reqId = reader.string();\n continue;\n }\n case 2: {\n if (tag !== 18) {\n break;\n }\n\n message.animation = FlameAnimation.decode(reader, reader.uint32());\n continue;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ServerResponseAnimationData {\n return {\n reqId: isSet(object.reqId) ? globalThis.String(object.reqId) : \"\",\n animation: isSet(object.animation) ? FlameAnimation.fromJSON(object.animation) : undefined,\n };\n },\n\n toJSON(message: ServerResponseAnimationData): unknown {\n const obj: any = {};\n if (message.reqId !== \"\") {\n obj.reqId = message.reqId;\n }\n if (message.animation !== undefined) {\n obj.animation = FlameAnimation.toJSON(message.animation);\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<ServerResponseAnimationData>, I>>(base?: I): ServerResponseAnimationData {\n return ServerResponseAnimationData.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<ServerResponseAnimationData>, I>>(object: I): ServerResponseAnimationData {\n const message = createBaseServerResponseAnimationData();\n message.reqId = object.reqId ?? \"\";\n message.animation = (object.animation !== undefined && object.animation !== null)\n ? FlameAnimation.fromPartial(object.animation)\n : undefined;\n return message;\n },\n};\n\nfunction createBaseErrorInfo(): ErrorInfo {\n return { reqId: \"\", code: 0, reason: \"\" };\n}\n\nexport const ErrorInfo: MessageFns<ErrorInfo> = {\n encode(message: ErrorInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n if (message.reqId !== \"\") {\n writer.uint32(10).string(message.reqId);\n }\n if (message.code !== 0) {\n writer.uint32(16).int32(message.code);\n }\n if (message.reason !== \"\") {\n writer.uint32(26).string(message.reason);\n }\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): ErrorInfo {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseErrorInfo();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (tag !== 10) {\n break;\n }\n\n message.reqId = reader.string();\n continue;\n }\n case 2: {\n if (tag !== 16) {\n break;\n }\n\n message.code = reader.int32();\n continue;\n }\n case 3: {\n if (tag !== 26) {\n break;\n }\n\n message.reason = reader.string();\n continue;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ErrorInfo {\n return {\n reqId: isSet(object.reqId) ? globalThis.String(object.reqId) : \"\",\n code: isSet(object.code) ? globalThis.Number(object.code) : 0,\n reason: isSet(object.reason) ? globalThis.String(object.reason) : \"\",\n };\n },\n\n toJSON(message: ErrorInfo): unknown {\n const obj: any = {};\n if (message.reqId !== \"\") {\n obj.reqId = message.reqId;\n }\n if (message.code !== 0) {\n obj.code = Math.round(message.code);\n }\n if (message.reason !== \"\") {\n obj.reason = message.reason;\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<ErrorInfo>, I>>(base?: I): ErrorInfo {\n return ErrorInfo.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<ErrorInfo>, I>>(object: I): ErrorInfo {\n const message = createBaseErrorInfo();\n message.reqId = object.reqId ?? \"\";\n message.code = object.code ?? 0;\n message.reason = object.reason ?? \"\";\n return message;\n },\n};\n\nfunction createBaseMessage(): Message {\n return { type: 0, error: undefined, serverResponseAnimation: undefined, clientAudioInput: undefined };\n}\n\nexport const Message: MessageFns<Message> = {\n encode(message: Message, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {\n if (message.type !== 0) {\n writer.uint32(8).int32(message.type);\n }\n if (message.error !== undefined) {\n ErrorInfo.encode(message.error, writer.uint32(18).fork()).join();\n }\n if (message.serverResponseAnimation !== undefined) {\n ServerResponseAnimationData.encode(message.serverResponseAnimation, writer.uint32(26).fork()).join();\n }\n if (message.clientAudioInput !== undefined) {\n ClientAudioInputData.encode(message.clientAudioInput, writer.uint32(34).fork()).join();\n }\n return writer;\n },\n\n decode(input: BinaryReader | Uint8Array, length?: number): Message {\n const reader = input instanceof BinaryReader ? input : new BinaryReader(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseMessage();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (tag !== 8) {\n break;\n }\n\n message.type = reader.int32() as any;\n continue;\n }\n case 2: {\n if (tag !== 18) {\n break;\n }\n\n message.error = ErrorInfo.decode(reader, reader.uint32());\n continue;\n }\n case 3: {\n if (tag !== 26) {\n break;\n }\n\n message.serverResponseAnimation = ServerResponseAnimationData.decode(reader, reader.uint32());\n continue;\n }\n case 4: {\n if (tag !== 34) {\n break;\n }\n\n message.clientAudioInput = ClientAudioInputData.decode(reader, reader.uint32());\n continue;\n }\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skip(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): Message {\n return {\n type: isSet(object.type) ? messageTypeFromJSON(object.type) : 0,\n error: isSet(object.error) ? ErrorInfo.fromJSON(object.error) : undefined,\n serverResponseAnimation: isSet(object.serverResponseAnimation)\n ? ServerResponseAnimationData.fromJSON(object.serverResponseAnimation)\n : undefined,\n clientAudioInput: isSet(object.clientAudioInput)\n ? ClientAudioInputData.fromJSON(object.clientAudioInput)\n : undefined,\n };\n },\n\n toJSON(message: Message): unknown {\n const obj: any = {};\n if (message.type !== 0) {\n obj.type = messageTypeToJSON(message.type);\n }\n if (message.error !== undefined) {\n obj.error = ErrorInfo.toJSON(message.error);\n }\n if (message.serverResponseAnimation !== undefined) {\n obj.serverResponseAnimation = ServerResponseAnimationData.toJSON(message.serverResponseAnimation);\n }\n if (message.clientAudioInput !== undefined) {\n obj.clientAudioInput = ClientAudioInputData.toJSON(message.clientAudioInput);\n }\n return obj;\n },\n\n create<I extends Exact<DeepPartial<Message>, I>>(base?: I): Message {\n return Message.fromPartial(base ?? ({} as any));\n },\n fromPartial<I extends Exact<DeepPartial<Message>, I>>(object: I): Message {\n const message = createBaseMessage();\n message.type = object.type ?? 0;\n message.error = (object.error !== undefined && object.error !== null)\n ? ErrorInfo.fromPartial(object.error)\n : undefined;\n message.serverResponseAnimation =\n (object.serverResponseAnimation !== undefined && object.serverResponseAnimation !== null)\n ? ServerResponseAnimationData.fromPartial(object.serverResponseAnimation)\n : undefined;\n message.clientAudioInput = (object.clientAudioInput !== undefined && object.clientAudioInput !== null)\n ? ClientAudioInputData.fromPartial(object.clientAudioInput)\n : undefined;\n return message;\n },\n};\n\nfunction bytesFromBase64(b64: string): Uint8Array {\n const bin = globalThis.atob(b64);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; ++i) {\n arr[i] = bin.charCodeAt(i);\n }\n return arr;\n}\n\nfunction base64FromBytes(arr: Uint8Array): string {\n const bin: string[] = [];\n arr.forEach((byte) => {\n bin.push(globalThis.String.fromCharCode(byte));\n });\n return globalThis.btoa(bin.join(\"\"));\n}\n\ntype Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;\n\nexport type DeepPartial<T> = T extends Builtin ? T\n : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>\n : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>\n : T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }\n : Partial<T>;\n\ntype KeysOfUnion<T> = T extends T ? keyof T : never;\nexport type Exact<P, I extends P> = P extends Builtin ? P\n : P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };\n\nfunction isSet(value: any): boolean {\n return value !== null && value !== undefined;\n}\n\nexport interface MessageFns<T> {\n encode(message: T, writer?: BinaryWriter): BinaryWriter;\n decode(input: BinaryReader | Uint8Array, length?: number): T;\n fromJSON(object: any): T;\n toJSON(message: T): unknown;\n create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;\n fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;\n}\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","/**\n * ReqID 生成工具\n * \n * 统一格式:时间戳(UTC时间,秒级,格式:YYYYMMDDHHmmss)+ 下划线 + 12位 NanoID\n * 示例:20251027143034_aB3dEf9hIjKl\n * \n * 时间部分使用 UTC 时间,便于跨端日志排查时统一转换时区检索\n */\n\nimport { customAlphabet } from 'nanoid'\n\n/**\n * 自定义字符集:只使用大小写字母和数字(URL 安全,不包含连字符)\n * 字符集:A-Z, a-z, 0-9 (62 个字符)\n */\nconst nanoid = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 12)\n\n/**\n * 生成统一的请求 ID\n * \n * 格式:时间戳(UTC时间,秒级,格式:YYYYMMDDHHmmss)+ 下划线 + 12位 NanoID\n * 时间部分使用 UTC 时间,便于跨端日志排查时统一转换时区检索\n * \n * @returns 格式为 YYYYMMDDHHmmss_nanoid 的请求 ID\n * @example\n * generateReqId() // \"20251027143034_aB3dEf9hIjKl\"\n */\nexport function generateReqId(): string {\n // 获取当前 UTC 时间\n const now = new Date()\n \n // 格式化为 YYYYMMDDHHmmss(UTC 时间)\n const year = now.getUTCFullYear()\n const month = String(now.getUTCMonth() + 1).padStart(2, '0')\n const day = String(now.getUTCDate()).padStart(2, '0')\n const hours = String(now.getUTCHours()).padStart(2, '0')\n const minutes = String(now.getUTCMinutes()).padStart(2, '0')\n const seconds = String(now.getUTCSeconds()).padStart(2, '0')\n \n const timestamp = `${year}${month}${day}${hours}${minutes}${seconds}`\n \n // 生成 12 位 NanoID(只包含字母和数字)\n const nanoId = nanoid()\n \n return `${timestamp}_${nanoId}`\n}\n\n","/**\n * Simple Event Emitter\n */\n\n// eslint-disable-next-line ts/no-explicit-any\ntype EventHandler = (...args: any[]) => void\n\nexport class EventEmitter {\n private events: Map<string, Set<EventHandler>> = new Map()\n\n on(event: string, handler: EventHandler): void {\n if (!this.events.has(event)) {\n this.events.set(event, new Set())\n }\n this.events.get(event)!.add(handler)\n }\n\n off(event: string, handler: EventHandler): void {\n const handlers = this.events.get(event)\n if (handlers) {\n handlers.delete(handler)\n if (handlers.size === 0) {\n this.events.delete(event)\n }\n }\n }\n\n // eslint-disable-next-line ts/no-explicit-any\n emit(event: string, ...args: any[]): void {\n const handlers = this.events.get(event)\n if (handlers) {\n handlers.forEach(handler => handler(...args))\n }\n }\n\n removeAllListeners(event?: string): void {\n if (event) {\n this.events.delete(event)\n }\n else {\n this.events.clear()\n }\n }\n}\n","/**\n * AnimationWebSocketClient:动画专用 WebSocket 客户端\n * 使用 driveningress/v1 协议,只处理音频输入和动画输出\n */\n\nimport type { Message } from '../generated/driveningress/v1/driveningress'\n\nimport { BinaryReader, BinaryWriter } from '@bufbuild/protobuf/wire'\n\nimport { Message as MessageCodec, MessageType } from '../generated/driveningress/v1/driveningress'\nimport { AvatarKit } from '../core/AvatarKit'\nimport { errorToMessage } from '../utils/error-utils'\nimport { logger } from '../utils/logger'\nimport { generateReqId } from '../utils/reqId'\nimport { EventEmitter } from './utils/eventEmitter'\n\nexport interface AnimationWebSocketClientOptions {\n wsUrl: string\n reconnectAttempts?: number\n debug?: boolean\n jwtToken?: string\n}\n\nexport class AnimationWebSocketClient extends EventEmitter {\n private wsUrl: string\n private reconnectAttempts: number\n private debug: boolean\n private jwtToken?: string\n\n private ws: WebSocket | null = null\n private currentCharacterId: string = ''\n private currentRetryCount: number = 0\n private isConnecting: boolean = false\n private isManuallyDisconnected: boolean = false\n private reconnectTimer: number | null = null\n\n constructor(options: AnimationWebSocketClientOptions) {\n super()\n this.wsUrl = options.wsUrl\n this.reconnectAttempts = options.reconnectAttempts ?? 5\n this.debug = options.debug ?? false\n this.jwtToken = options.jwtToken\n }\n\n /**\n * 连接WebSocket\n */\n async connect(characterId: string): Promise<void> {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n logger.log('[AnimationWebSocketClient] Already connected')\n return\n }\n\n if (this.isConnecting) {\n logger.log('[AnimationWebSocketClient] Already connecting')\n return\n }\n\n try {\n this.isConnecting = true\n this.currentCharacterId = characterId\n\n const url = this.buildWebSocketUrl(characterId)\n logger.log('[AnimationWebSocketClient] Connecting to:', url)\n\n await this.connectWebSocket(url)\n logger.log('[AnimationWebSocketClient] Connected successfully')\n AvatarKit.logEvent('character_animation_service', 'info', {\n characterId,\n event: 'connect_success',\n url,\n })\n }\n catch (error) {\n this.isConnecting = false\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AnimationWebSocketClient] Connection failed:', message)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId,\n event: 'connect_failed',\n reason: message,\n })\n throw error\n }\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n if (this.ws) {\n this.ws.close(1000, 'Normal closure')\n this.ws = null\n }\n\n this.currentRetryCount = 0\n this.isConnecting = false\n this.isManuallyDisconnected = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n logger.log('[AnimationWebSocketClient] Disconnected')\n }\n\n /**\n * 发送音频数据\n */\n sendAudioData(reqId: string, audioData: ArrayBuffer, end: boolean): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n logger.error('[AnimationWebSocketClient] WebSocket not connected')\n return false\n }\n\n try {\n const message: Message = {\n type: MessageType.MESSAGE_CLIENT_AUDIO_INPUT,\n clientAudioInput: {\n reqId,\n audio: new Uint8Array(audioData),\n end,\n },\n }\n\n const writer = new BinaryWriter()\n MessageCodec.encode(message, writer)\n const bytes = writer.finish()\n\n this.ws.send(bytes)\n return true\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AnimationWebSocketClient] Failed to send audio data:', message)\n AvatarKit.logEvent('character_animation_service', 'warning', {\n characterId: this.currentCharacterId,\n event: 'send_audio_failed',\n reqId,\n reason: message,\n })\n this.emit('error', error as Error)\n return false\n }\n }\n\n /**\n * 生成请求ID\n * 使用统一的 ReqID 生成规则:YYYYMMDDHHmmss_nanoid\n */\n generateReqId(): string {\n return generateReqId()\n }\n\n /**\n * 获取连接状态\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN\n }\n\n /**\n * 获取当前角色ID\n */\n getCurrentCharacterId(): string {\n return this.currentCharacterId\n }\n\n // ========== 私有方法 ==========\n\n private buildWebSocketUrl(characterId: string): string {\n const url = new URL(this.wsUrl)\n url.searchParams.set('id', characterId)\n\n if (this.jwtToken) {\n url.searchParams.set('token', this.jwtToken)\n }\n\n return url.toString()\n }\n\n private connectWebSocket(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.ws = new WebSocket(url)\n\n this.ws.onopen = () => {\n this.isConnecting = false\n this.currentRetryCount = 0\n this.isManuallyDisconnected = false\n this.emit('connected')\n resolve()\n }\n\n this.ws.onmessage = (event) => {\n if (event.data instanceof ArrayBuffer) {\n this.handleMessage(event.data)\n }\n else if (event.data instanceof Blob) {\n event.data.arrayBuffer().then(this.handleMessage.bind(this)).catch((err) => {\n logger.error('[AnimationWebSocketClient] Failed to convert Blob to ArrayBuffer:', err)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.currentCharacterId,\n event: 'decode_blob_failed',\n reason: err instanceof Error ? err.message : String(err),\n })\n this.emit('error', err as Error)\n })\n }\n else {\n logger.warn('[AnimationWebSocketClient] Received non-binary data:', typeof event.data)\n }\n }\n\n this.ws.onerror = (error) => {\n logger.errorWithError('[AnimationWebSocketClient] WebSocket error:', error)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.currentCharacterId,\n event: 'websocket_error',\n })\n this.emit('error', new Error('WebSocket error'))\n if (!this.isManuallyDisconnected && this.currentRetryCount < this.reconnectAttempts) {\n this.scheduleReconnect()\n }\n }\n\n this.ws.onclose = (event) => {\n logger.log('[AnimationWebSocketClient] WebSocket closed:', event.code, event.reason)\n this.emit('disconnected', event.reason || 'Connection closed')\n if (event.code === 1012) {\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.currentCharacterId,\n event: 'service_restart',\n reason: event.reason || 'service restart',\n })\n }\n\n if (!this.isManuallyDisconnected && this.currentRetryCount < this.reconnectAttempts) {\n this.scheduleReconnect()\n }\n }\n }\n catch (error) {\n this.isConnecting = false\n reject(error)\n }\n })\n }\n\n private handleMessage(data: ArrayBuffer): void {\n try {\n const reader = new BinaryReader(new Uint8Array(data))\n const message = MessageCodec.decode(reader)\n\n // 检查消息中是否包含错误信息\n if (message.error) {\n logger.error(`[AnimationWebSocketClient] Server error: reqId=${message.error.reqId}, code=${message.error.code}, reason=${message.error.reason}`)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.currentCharacterId,\n event: 'server_error',\n reqId: message.error.reqId,\n code: message.error.code,\n reason: message.error.reason,\n })\n this.emit('error', new Error(message.error.reason || 'Server error'))\n return\n }\n\n if (message.type === MessageType.MESSAGE_ERROR) {\n logger.warn('[AnimationWebSocketClient] MESSAGE_ERROR received but no error field in message')\n AvatarKit.logEvent('character_animation_service', 'warning', {\n characterId: this.currentCharacterId,\n event: 'message_error_without_payload',\n })\n this.emit('error', new Error('Server returned error message without error details'))\n return\n }\n\n this.emit('message', message)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AnimationWebSocketClient] Failed to decode message:', message)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.currentCharacterId,\n event: 'decode_failed',\n reason: message,\n })\n this.emit('error', error as Error)\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n }\n\n this.currentRetryCount++\n const delay = Math.min(1000 * Math.pow(2, this.currentRetryCount - 1), 30000)\n\n logger.log(`[AnimationWebSocketClient] Scheduling reconnect attempt ${this.currentRetryCount}/${this.reconnectAttempts} in ${delay}ms`)\n\n this.reconnectTimer = window.setTimeout(() => {\n if (!this.isManuallyDisconnected && this.currentCharacterId) {\n this.emit('reconnecting', `Reconnect attempt ${this.currentRetryCount}`)\n this.connect(this.currentCharacterId).catch((error) => {\n logger.error('[AnimationWebSocketClient] Reconnect failed:', error instanceof Error ? error.message : String(error))\n })\n }\n }, delay)\n }\n}\n","/**\n * NetworkLayer:网络通信层\n * 负责 WebSocket 连接、协议处理、数据获取\n * 获取数据后自动调用 AvatarController(播放层)的接口\n */\n\nimport type { Message } from '../generated/driveningress/v1/driveningress'\nimport type { AvatarController } from './AvatarController'\n\nimport { MessageType } from '../generated/driveningress/v1/driveningress'\nimport { APP_CONFIG } from '../config/app-config'\nimport { ConnectionState, SPAvatarError } from '../types'\nimport { logger } from '../utils/logger'\nimport { AvatarKit } from './AvatarKit'\nimport { AnimationWebSocketClient } from '../animation/AnimationWebSocketClient'\n\n/**\n * 音频指标\n */\ninterface AudioMetrics {\n accumulatedBytes: number\n startTimestamp: number\n tap2Timestamp: number\n tap4Timestamp: number\n endTimestamp: number\n recvFirstFlameTimestamp: number\n didRecvFirstFlame: boolean\n}\n\nexport class NetworkLayer {\n private wsClient: AnimationWebSocketClient\n private dataController: AvatarController // 组合播放层\n private currentReqId: string | null = null\n private hasSentEnd = false\n private readonly audioBytesPerSecond = APP_CONFIG.audio.sampleRate * 2\n private audioMetrics: AudioMetrics = this.createAudioMetrics()\n\n constructor(dataController: AvatarController) {\n this.dataController = dataController\n\n // 初始化 WebSocket 客户端\n const config = AvatarKit.getEnvironmentConfig()\n this.wsClient = new AnimationWebSocketClient({\n wsUrl: config.driveningressWsUrl,\n reconnectAttempts: 5,\n debug: false,\n jwtToken: AvatarKit.sessionToken || undefined,\n })\n\n // 设置事件监听器\n this.setupWebSocketListeners()\n }\n\n /**\n * 连接服务\n */\n async connect(characterId: string): Promise<void> {\n await this.wsClient.connect(characterId)\n }\n\n /**\n * 发送音频数据到服务器\n */\n sendAudioData(audioData: ArrayBuffer, isLast: boolean): void {\n // 如果上一个请求已经发送过 end=true 且正在播放,说明这是新请求\n // 需要打断当前播放并生成新的 reqId\n if (this.hasSentEnd && this.dataController.getIsPlaying() && this.currentReqId) {\n this.dataController.interrupt()\n }\n\n // 生成请求ID(如果还没有的话)\n if (!this.currentReqId) {\n this.currentReqId = this.wsClient.generateReqId()\n this.hasSentEnd = false\n this.resetAudioMetrics()\n AvatarKit.logEvent('character_manager', 'info', {\n characterId: this.dataController.getAvatarId(),\n event: 'conversation_started',\n reqId: this.currentReqId,\n })\n }\n\n if (isLast) {\n this.hasSentEnd = true\n }\n\n // 统计音频指标\n const metrics = this.audioMetrics\n let shouldReportMetrics = false\n\n if (metrics.startTimestamp === 0) {\n metrics.startTimestamp = Date.now()\n shouldReportMetrics = true\n }\n\n metrics.accumulatedBytes += audioData.byteLength\n const currentDuration = metrics.accumulatedBytes / this.audioBytesPerSecond\n\n if (currentDuration >= 2 && metrics.tap2Timestamp === 0) {\n metrics.tap2Timestamp = Date.now()\n shouldReportMetrics = true\n }\n\n if (currentDuration >= 4 && metrics.tap4Timestamp === 0) {\n metrics.tap4Timestamp = Date.now()\n shouldReportMetrics = true\n }\n\n if (isLast && metrics.endTimestamp === 0) {\n metrics.endTimestamp = Date.now()\n shouldReportMetrics = true\n }\n\n // 检查音频数据是否为空\n if (audioData.byteLength === 0 && !isLast) {\n logger.warn('[NetworkLayer] Warning: sending empty audio data (size=0, end=false)')\n }\n\n // 发送到服务器\n const sent = this.wsClient.sendAudioData(this.currentReqId!, audioData, isLast)\n if (!sent) {\n logger.error('[NetworkLayer] Failed to send audio data to WebSocket')\n this.dataController.onError?.(new SPAvatarError('Failed to send audio data to WebSocket', 'SEND_FAILED'))\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.dataController.getAvatarId(),\n event: 'send_audio_failed',\n reqId: this.currentReqId,\n })\n return\n }\n\n if (shouldReportMetrics && this.currentReqId) {\n this.reportAudioMetrics(this.currentReqId)\n }\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n this.wsClient.disconnect()\n this.currentReqId = null\n this.hasSentEnd = false\n }\n\n /**\n * 获取当前请求ID\n */\n getCurrentReqId(): string | null {\n return this.currentReqId\n }\n\n /**\n * 重置请求ID(用于打断后清理)\n */\n resetReqId(): void {\n this.currentReqId = null\n this.hasSentEnd = false\n }\n\n /**\n * 设置 WebSocket 事件监听器\n */\n private setupWebSocketListeners(): void {\n this.wsClient.on('connected', async () => {\n this.dataController.setConnected(true)\n this.dataController.onConnectionState?.(ConnectionState.connected)\n AvatarKit.logEvent('character_animation_service', 'info', {\n characterId: this.dataController.getAvatarId(),\n event: 'connected',\n })\n })\n\n this.wsClient.on('disconnected', () => {\n this.dataController.setConnected(false)\n this.dataController.onConnectionState?.(ConnectionState.disconnected)\n AvatarKit.logEvent('character_animation_service', 'warning', {\n characterId: this.dataController.getAvatarId(),\n event: 'disconnected',\n })\n })\n\n this.wsClient.on('reconnecting', () => {\n AvatarKit.logEvent('character_animation_service', 'info', {\n characterId: this.dataController.getAvatarId(),\n event: 'reconnecting',\n })\n })\n\n this.wsClient.on('error', (error: Error) => {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[NetworkLayer] WebSocket error:', message)\n AvatarKit.logEvent('character_animation_service', 'error', {\n characterId: this.dataController.getAvatarId(),\n event: 'websocket_error',\n reason: message,\n })\n this.dataController.onConnectionState?.(ConnectionState.failed)\n this.dataController.onError?.(error)\n })\n\n this.wsClient.on('message', (message: Message) => {\n this.handleMessage(message)\n })\n }\n\n /**\n * 处理接收到的消息\n */\n private handleMessage(message: Message): void {\n try {\n switch (message.type) {\n case MessageType.MESSAGE_SERVER_RESPONSE_ANIMATION:\n this.handleAnimationMessage(message)\n break\n case MessageType.MESSAGE_ERROR:\n this.handleErrorMessage(message)\n break\n default:\n // 忽略未知消息类型\n }\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[NetworkLayer] Failed to handle message:', message)\n AvatarKit.logEvent('character_manager', 'error', {\n characterId: this.dataController.getAvatarId(),\n event: 'handle_message_failed',\n reason: message,\n })\n }\n }\n\n /**\n * 处理动画消息\n */\n private handleAnimationMessage(message: Message): void {\n if (!message.serverResponseAnimation) {\n logger.error('[NetworkLayer] Invalid animation message')\n return\n }\n\n const { reqId, animation } = message.serverResponseAnimation\n\n // 只接受当前活跃请求的动画\n if (!this.currentReqId || reqId !== this.currentReqId) {\n logger.warn(`[NetworkLayer] Ignoring mismatched animation message - expected reqId: ${this.currentReqId}, received reqId: ${reqId}`)\n AvatarKit.logEvent('character_manager', 'warning', {\n characterId: this.dataController.getAvatarId(),\n event: 'animation_reqid_mismatch',\n expectedReqId: this.currentReqId,\n receivedReqId: reqId,\n })\n return\n }\n\n if (animation?.keyframes && animation.keyframes.length > 0) {\n const keyframes = animation.keyframes\n\n // 网络层获取数据后,调用播放层接口\n this.dataController.sendKeyframes(keyframes)\n\n // 如果是第一条消息,触发播放\n if (!this.dataController.getIsPlaying()) {\n this.dataController.startStreamingPlayback()\n }\n\n // 统计第一条动画数据接收时间\n if (!this.audioMetrics.didRecvFirstFlame) {\n this.audioMetrics.didRecvFirstFlame = true\n this.audioMetrics.recvFirstFlameTimestamp = Date.now()\n if (this.currentReqId) {\n this.reportAudioMetrics(this.currentReqId)\n }\n }\n } else {\n logger.warn(`[NetworkLayer] Animation message has no keyframes - reqId: ${reqId}`)\n AvatarKit.logEvent('character_manager', 'warning', {\n characterId: this.dataController.getAvatarId(),\n event: 'animation_empty_keyframes',\n reqId,\n })\n }\n }\n\n /**\n * 处理错误消息\n */\n private handleErrorMessage(message: Message): void {\n if (!message.error) {\n logger.warn('[NetworkLayer] MESSAGE_ERROR received but message.error is empty')\n // 检查是否包含动画数据(可能是消息类型解析错误)\n if (message.serverResponseAnimation) {\n logger.warn('[NetworkLayer] MESSAGE_ERROR contains animation data, treating as animation message')\n AvatarKit.logEvent('character_manager', 'warning', {\n characterId: this.dataController.getAvatarId(),\n event: 'message_error_with_payload',\n })\n this.handleAnimationMessage(message)\n }\n return\n }\n\n logger.error(`[NetworkLayer] Server error: reqId=${message.error.reqId}, code=${message.error.code}, reason=${message.error.reason}`)\n AvatarKit.logEvent('character_manager', 'error', {\n characterId: this.dataController.getAvatarId(),\n event: 'server_error',\n reqId: message.error.reqId,\n code: message.error.code,\n reason: message.error.reason,\n })\n\n const errorCode = message.error.code?.toString().toLowerCase() ?? ''\n if (errorCode.includes('unauth') || errorCode === '401') {\n AvatarKit.logEvent('sdk_verify', 'error', {\n characterId: this.dataController.getAvatarId(),\n reqId: message.error.reqId,\n reason: message.error.reason,\n })\n }\n\n this.dataController.onError?.(new SPAvatarError(\n message.error.reason || 'Server error occurred',\n message.error.code?.toString() || 'SERVER_ERROR',\n ))\n\n // 如果是当前请求的错误,停止播放并清理状态\n if (this.currentReqId && message.error.reqId === this.currentReqId) {\n this.dataController.interrupt()\n }\n }\n\n /**\n * 创建音频指标\n */\n private createAudioMetrics(): AudioMetrics {\n return {\n accumulatedBytes: 0,\n startTimestamp: 0,\n tap2Timestamp: 0,\n tap4Timestamp: 0,\n endTimestamp: 0,\n recvFirstFlameTimestamp: 0,\n didRecvFirstFlame: false,\n }\n }\n\n /**\n * 重置音频指标\n */\n private resetAudioMetrics(): void {\n this.audioMetrics = this.createAudioMetrics()\n }\n\n /**\n * 上报音频指标\n */\n private reportAudioMetrics(reqId: string): void {\n if (!reqId || this.audioMetrics.startTimestamp === 0) {\n return\n }\n\n AvatarKit.logEvent('send_audio_measure', 'info', {\n reqId,\n start: this.audioMetrics.startTimestamp,\n tap2: this.audioMetrics.tap2Timestamp,\n tap4: this.audioMetrics.tap4Timestamp,\n end: this.audioMetrics.endTimestamp,\n firstFlame: this.audioMetrics.recvFirstFlameTimestamp,\n })\n }\n}\n\n","/**\n * AvatarController: Unified data controller (playback layer)\n * Responsible for audio playback and animation rendering synchronization\n * Automatically decides whether to compose network layer based on configuration\n */\n\nimport type { Flame } from '../generated/driveningress/v1/driveningress'\nimport type { Avatar } from './Avatar'\n\nimport { APP_CONFIG } from '../config/app-config'\nimport { convertProtoFlameToWasmParams } from '../animation/utils/flameConverter'\nimport { AnimationPlayer } from '../audio/AnimationPlayer'\nimport { AvatarState, ConnectionState, SPAvatarError, AvatarPlaybackMode } from '../types'\nimport { logger } from '../utils/logger'\nimport { AvatarKit } from './AvatarKit'\nimport { NetworkLayer } from './NetworkLayer'\n\nexport class AvatarController {\n // ========== Configuration and Composition ==========\n private networkLayer?: NetworkLayer\n public readonly playbackMode: AvatarPlaybackMode\n protected avatar: Avatar\n\n // ========== Player Management ==========\n protected animationPlayer: AnimationPlayer | null = null\n protected currentKeyframes: Flame[] = []\n protected pendingAudioChunks: Array<{ data: Uint8Array, isLast: boolean }> = []\n protected isPlaying = false\n\n // ========== State Management ==========\n protected isConnected = false\n protected currentState: AvatarState = AvatarState.idle\n\n // ========== Event System ==========\n public onConnectionState: ((state: ConnectionState) => void) | null = null\n public onAvatarState: ((state: AvatarState) => void) | null = null\n public onError: ((error: Error) => void) | null = null\n private eventListeners = new Map<string, Set<(data?: any) => void>>()\n\n // ========== Callbacks ==========\n private renderCallback?: (splatData: Float32Array, frameIndex: number) => void\n private transitionCompleteCallback?: () => void\n\n // ========== Playback Loop ==========\n private playbackLoopId: number | null = null\n private lastRenderedFrameIndex: number = -1\n\n constructor(avatar: Avatar, options?: { playbackMode?: AvatarPlaybackMode }) {\n this.avatar = avatar\n this.playbackMode = options?.playbackMode ?? AvatarPlaybackMode.network\n\n // 如果是网络模式,自动创建并组合网络层\n if (this.playbackMode === AvatarPlaybackMode.network) {\n this.networkLayer = new NetworkLayer(this)\n }\n }\n\n // ========== 公共访问器 ==========\n\n /**\n * 获取 Avatar ID(供 NetworkLayer 使用)\n */\n getAvatarId(): string {\n return this.avatar.id\n }\n\n /**\n * 获取播放状态(供 NetworkLayer 使用)\n */\n getIsPlaying(): boolean {\n return this.isPlaying\n }\n\n /**\n * 设置连接状态(供 NetworkLayer 使用)\n */\n setConnected(connected: boolean): void {\n this.isConnected = connected\n }\n\n /**\n * 获取连接状态\n */\n get connected(): boolean {\n return this.isConnected\n }\n\n /**\n * 获取当前状态\n */\n get state(): AvatarState {\n return this.currentState\n }\n\n /**\n * 获取动画播放器实例\n * @internal\n */\n public getAnimationPlayer(): AnimationPlayer | null {\n return this.animationPlayer\n }\n\n // ========== 网络模式接口 ==========\n\n /**\n * 启动服务(仅网络模式)\n */\n async start(): Promise<void> {\n if (!this.networkLayer) {\n throw new SPAvatarError(\n 'Network layer not available. Use network playback mode.',\n 'NETWORK_LAYER_NOT_AVAILABLE'\n )\n }\n\n // 初始化播放器\n if (!this.animationPlayer) {\n this.animationPlayer = new AnimationPlayer()\n try {\n await this.animationPlayer.createAndInitializeStreamingPlayer()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AvatarController] Failed to create streaming player:', message)\n AvatarKit.logEvent('character_player', 'error', {\n characterId: this.avatar.id,\n event: 'streaming_player_init_failed',\n reason: message,\n })\n throw error\n }\n }\n\n await this.networkLayer.connect(this.avatar.id)\n // 注意:onConnectionState 会在 NetworkLayer 的 WebSocket 连接成功时被调用\n // 这里不需要立即调用,因为连接是异步的\n }\n\n /**\n * 发送音频到服务器(仅网络模式)\n * 同时缓存到数据层用于播放\n */\n send(audioData: ArrayBuffer, end: boolean = false): void {\n if (!this.networkLayer || !this.isConnected) {\n this.onError?.(new SPAvatarError('Service not connected', 'NOT_CONNECTED'))\n AvatarKit.logEvent('character_manager', 'warning', {\n characterId: this.avatar.id,\n event: 'send_not_connected',\n })\n return\n }\n\n // 通过网络层发送到服务器\n this.networkLayer.sendAudioData(audioData, end)\n\n // 同时缓存到数据层(用于播放)\n this.addAudioChunkToBuffer(new Uint8Array(audioData), end)\n\n this.onAvatarState?.(AvatarState.active)\n }\n\n /**\n * 关闭服务(仅网络模式)\n */\n close(): void {\n this.networkLayer?.disconnect()\n this.isConnected = false\n this.onConnectionState?.(ConnectionState.disconnected)\n }\n\n // ========== 外部数据模式接口 ==========\n\n /**\n * 开始播放(外部数据模式)\n * 必须先调用此方法,传入初始数据开始播放\n */\n async play(\n initialAudioChunks?: Array<{ data: Uint8Array, isLast: boolean }>,\n initialKeyframes?: Flame[]\n ): Promise<void> {\n if (this.isPlaying) {\n return\n }\n\n // 懒加载初始化播放器\n if (!this.animationPlayer) {\n this.animationPlayer = new AnimationPlayer()\n }\n\n if (!this.animationPlayer.isStreamingReady()) {\n await this.animationPlayer.createAndInitializeStreamingPlayer()\n }\n\n // 添加初始数据\n if (initialAudioChunks && initialAudioChunks.length > 0) {\n this.pendingAudioChunks.push(...initialAudioChunks)\n }\n\n if (initialKeyframes && initialKeyframes.length > 0) {\n if (this.currentKeyframes.length === 0) {\n this.currentKeyframes = initialKeyframes\n } else {\n this.currentKeyframes.push(...initialKeyframes)\n }\n this.emit('keyframesUpdate', this.currentKeyframes)\n }\n\n // 检查数据是否准备好\n if (this.currentKeyframes.length === 0) {\n throw new SPAvatarError('No animation keyframes to play', 'NO_ANIMATION')\n }\n\n if (this.pendingAudioChunks.length === 0) {\n throw new SPAvatarError('No audio chunks to play', 'NO_AUDIO')\n }\n\n await this.startStreamingPlayback()\n }\n\n /**\n * 发送音频数据(外部数据模式)\n * 在 play() 之后流式添加剩余音频数据\n */\n sendAudioChunk(data: Uint8Array, isLast: boolean = false): void {\n // 如果播放器已准备好且正在播放,直接添加到播放器\n if (this.isPlaying && this.animationPlayer?.isStreamingReady()) {\n this.animationPlayer.addAudioChunk(data, isLast)\n } else {\n // 否则缓存到 pendingAudioChunks\n if (data.length > 0 || isLast) {\n this.pendingAudioChunks.push({ data, isLast })\n this.onAvatarState?.(AvatarState.active)\n }\n }\n }\n\n /**\n * 发送动画关键帧(外部数据模式或网络模式)\n * 在 play() 之后流式添加剩余动画数据\n */\n sendKeyframes(keyframes: Flame[]): void {\n if (this.currentKeyframes.length === 0) {\n this.currentKeyframes = keyframes\n } else {\n this.currentKeyframes.push(...keyframes)\n }\n this.emit('keyframesUpdate', this.currentKeyframes)\n }\n\n // ========== 通用接口 ==========\n\n /**\n * 打断当前播放\n */\n interrupt(): void {\n this.stopPlayback()\n this.emit('interrupt')\n this.currentKeyframes = []\n this.pendingAudioChunks = []\n this.onAvatarState?.(AvatarState.idle)\n \n // 如果是网络模式,重置 reqId\n if (this.networkLayer) {\n this.networkLayer.resetReqId()\n }\n }\n\n /**\n * 清理所有数据和资源\n */\n clear(): void {\n if (this.isPlaying) {\n this.stopPlayback()\n }\n this.networkLayer?.disconnect()\n this.cleanupPlayers()\n this.currentKeyframes = []\n this.pendingAudioChunks = []\n this.isConnected = false\n this.onAvatarState?.(AvatarState.idle)\n }\n\n // ========== 内部方法(供 NetworkLayer 和 AvatarView 使用)==========\n\n /**\n * 开始流式播放(内部方法,由 NetworkLayer 或 play() 调用)\n */\n startStreamingPlayback(): Promise<void> {\n return this.startStreamingPlaybackInternal()\n }\n\n /**\n * 设置渲染回调(由 AvatarView 调用)\n */\n setRenderCallback(callback: (splatData: Float32Array, frameIndex: number) => void): void {\n this.renderCallback = callback\n }\n\n /**\n * 设置过渡完成回调(由 AvatarView 调用)\n */\n setTransitionCompleteCallback(callback: () => void): void {\n this.transitionCompleteCallback = callback\n }\n\n /**\n * 过渡完成通知(由 AvatarView 调用)\n */\n onTransitionComplete(): void {\n // 启动音频播放\n const streamingPlayer = this.animationPlayer?.getStreamingPlayer()\n if (streamingPlayer) {\n streamingPlayer.play()\n }\n }\n\n /**\n * 为 AvatarView 提供注册内部事件的接口\n * @internal\n */\n public setupInternalEventListeners(callbacks: {\n onKeyframesUpdate?: (keyframes: Flame[]) => void\n onStartRendering?: () => void\n onStopRendering?: () => void\n onInterrupt?: () => void\n }): void {\n if (callbacks.onKeyframesUpdate) {\n this.registerEventListener('keyframesUpdate', callbacks.onKeyframesUpdate)\n }\n if (callbacks.onStartRendering) {\n this.registerEventListener('startRendering', callbacks.onStartRendering)\n }\n if (callbacks.onStopRendering) {\n this.registerEventListener('stopRendering', callbacks.onStopRendering)\n }\n if (callbacks.onInterrupt) {\n this.registerEventListener('interrupt', callbacks.onInterrupt)\n }\n }\n\n // ========== 私有方法 ==========\n\n /**\n * 开始流式播放(内部实现)\n */\n private async startStreamingPlaybackInternal(): Promise<void> {\n if (!this.animationPlayer) {\n logger.error('[AvatarController] AnimationPlayer not initialized')\n return\n }\n\n // 如果没有动画数据,不能播放\n if (!this.currentKeyframes || this.currentKeyframes.length === 0) {\n logger.warn('[AvatarController] No animation keyframes to play')\n return\n }\n\n try {\n // 准备播放器\n await this.animationPlayer.prepareStreamingPlayer(() => {\n this.isPlaying = false\n this.onAvatarState?.(AvatarState.idle)\n this.emit('stopRendering')\n \n AvatarKit.logEvent('character_player', 'info', {\n characterId: this.avatar.id,\n event: 'playback_ended',\n reqId: this.networkLayer?.getCurrentReqId() || undefined,\n })\n })\n\n // 通知开始渲染(触发过渡动画生成)\n this.emit('startRendering')\n\n // 获取 StreamingAudioPlayer 并禁用自动播放(等待过渡动画完成)\n const streamingPlayer = this.animationPlayer.getStreamingPlayer()\n if (streamingPlayer) {\n streamingPlayer.setAutoStart(false)\n }\n\n // 添加初始音频数据(不自动播放)\n if (streamingPlayer) {\n await streamingPlayer.startNewSession(this.pendingAudioChunks)\n }\n this.pendingAudioChunks = []\n\n // 标记为播放中(音频将在过渡完成后由 onTransitionComplete 启动)\n this.isPlaying = true\n this.onAvatarState?.(AvatarState.playing)\n\n // 开始播放循环(音画同步)\n this.startPlaybackLoop()\n\n AvatarKit.logEvent('character_player', 'info', {\n characterId: this.avatar.id,\n event: 'playback_started',\n reqId: this.networkLayer?.getCurrentReqId() || undefined,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('[AvatarController] Failed to start streaming playback:', message)\n this.onError?.(new SPAvatarError('Failed to start streaming playback', 'INIT_FAILED'))\n this.isPlaying = false\n }\n }\n\n /**\n * 播放循环:根据音频时间计算动画帧,通知渲染层渲染\n */\n private startPlaybackLoop(): void {\n if (this.playbackLoopId) {\n return\n }\n\n const fps = APP_CONFIG.animation.fps\n\n const playLoop = async () => {\n if (!this.isPlaying || !this.animationPlayer) {\n this.playbackLoopId = null\n return\n }\n\n try {\n // 获取音频时间(主时钟)\n const audioTime = this.animationPlayer.getCurrentTime()\n\n // 如果音频还没开始播放(过渡动画期间),不渲染实时帧\n if (audioTime === 0) {\n this.playbackLoopId = requestAnimationFrame(playLoop)\n return\n }\n\n // 根据音频时间计算动画帧索引\n let frameIndex = Math.floor(audioTime * fps)\n\n // 限制在有效范围内\n if (frameIndex < 0) frameIndex = 0\n if (frameIndex >= this.currentKeyframes.length) {\n frameIndex = this.currentKeyframes.length - 1\n }\n\n // 性能优化:跳过重复帧渲染\n if (frameIndex === this.lastRenderedFrameIndex) {\n this.playbackLoopId = requestAnimationFrame(playLoop)\n return\n }\n\n this.lastRenderedFrameIndex = frameIndex\n\n // 获取当前帧并渲染\n if (frameIndex >= 0 && frameIndex < this.currentKeyframes.length) {\n const currentFrame = this.currentKeyframes[frameIndex]\n const wasmParams = convertProtoFlameToWasmParams(currentFrame)\n\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore) {\n const splatData = await avatarCore.computeFrameFlatFromParams(wasmParams)\n if (splatData && this.renderCallback) {\n // 通知渲染层渲染这一帧\n this.renderCallback(splatData, frameIndex)\n }\n }\n }\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('[AvatarController] Playback loop error:', errorMessage)\n }\n\n // 继续下一帧\n if (this.isPlaying) {\n this.playbackLoopId = requestAnimationFrame(playLoop)\n } else {\n this.playbackLoopId = null\n }\n }\n\n this.playbackLoopId = requestAnimationFrame(playLoop)\n }\n\n /**\n * 停止播放循环\n */\n private stopPlaybackLoop(): void {\n if (this.playbackLoopId) {\n cancelAnimationFrame(this.playbackLoopId)\n this.playbackLoopId = null\n }\n }\n\n /**\n * 停止播放\n */\n protected stopPlayback(): void {\n this.stopPlaybackLoop()\n if (this.animationPlayer) {\n this.animationPlayer.stop()\n const streamingPlayer = this.animationPlayer.getStreamingPlayer()\n streamingPlayer?.stop()\n }\n this.emit('stopRendering')\n this.isPlaying = false\n this.onAvatarState?.(AvatarState.idle)\n }\n\n /**\n * 清理播放器\n */\n protected cleanupPlayers(): void {\n if (this.animationPlayer) {\n this.animationPlayer.dispose()\n this.animationPlayer = null\n }\n }\n\n /**\n * 添加音频块到缓冲区\n */\n private addAudioChunkToBuffer(data: Uint8Array, isLast: boolean): void {\n if (!this.animationPlayer) {\n this.animationPlayer = new AnimationPlayer()\n }\n\n if (this.isPlaying && this.animationPlayer.isStreamingReady()) {\n this.animationPlayer.addAudioChunk(data, isLast)\n } else {\n this.pendingAudioChunks.push({ data, isLast })\n }\n }\n\n /**\n * 事件系统\n */\n private registerEventListener(event: string, callback: (data?: any) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set())\n }\n this.eventListeners.get(event)!.add(callback)\n }\n\n /**\n * 触发事件\n */\n protected emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event)\n if (listeners) {\n listeners.forEach(callback => callback(data))\n }\n }\n}\n","/**\n * Error Utility Functions\n * Provides consistent error handling and formatting across the application\n */\n\n/**\n * Convert unknown error to a readable error message string\n *\n * @param err - Unknown error object (could be Error, string, object, etc.)\n * @returns Formatted error message string\n *\n * @example\n * try {\n * riskyOperation()\n * } catch (err) {\n * const message = errorToMessage(err)\n * logger.error('Operation failed:', message)\n * }\n */\nexport function errorToMessage(err: unknown): string {\n if (err instanceof Error) {\n return err.message\n }\n\n if (typeof err === 'string') {\n return err\n }\n\n if (typeof err === 'object' && err !== null) {\n // Try to extract message property if it exists\n if ('message' in err && typeof err.message === 'string') {\n return err.message\n }\n\n // Try to stringify object\n try {\n return JSON.stringify(err)\n }\n catch {\n return String(err)\n }\n }\n\n return String(err)\n}\n\n/**\n * Convert unknown error to a detailed error message with stack trace (for logging)\n *\n * @param err - Unknown error object\n * @returns Detailed error message with stack if available\n */\nexport function errorToDetailedMessage(err: unknown): string {\n if (err instanceof Error) {\n return err.stack || `${err.name}: ${err.message}`\n }\n\n return errorToMessage(err)\n}\n","/**\n * Avatar Downloader (iOS Compatible)\n * Downloads character resources from CharacterMeta structure\n */\n\nimport type { CharacterMeta, PreloadCameraSettings } from '../types/character'\nimport type { CharacterSettings } from '../types/character-settings'\n\nimport { APP_CONFIG } from '../config/app-config'\nimport { errorToMessage } from '../utils/error-utils'\nimport { logger } from '../utils/logger'\nimport { AvatarKit } from './AvatarKit'\n\ninterface ProgressInfo {\n stage: string\n filename: string\n loaded: number\n total: number\n progress: number\n}\n\ntype ProgressCallback = (info: ProgressInfo) => void\n\ninterface TemplateResources {\n [key: string]: ArrayBuffer\n}\n\ninterface FlameResources {\n flameModel?: { remote?: string }\n flameTemplate?: { remote?: string }\n teethPb?: { remote?: string }\n teethNpz?: { remote?: string }\n}\n\ninterface CharacterDataResult {\n shape: ArrayBuffer\n pointCloud: ArrayBuffer\n idleAnimation?: ArrayBuffer // optional: frameIdle animation\n monoAnimation?: ArrayBuffer // optional: frameMono animation\n monoAudioUrl?: string // optional: audioMono URL (for <audio> playback)\n}\n\nexport interface PreloadResult {\n templateResources: TemplateResources\n characterData: CharacterDataResult\n preloadCameraSettings?: PreloadCameraSettings // 相机配置\n characterSettings?: CharacterSettings // 角色设置(包含 eyelid 等)\n}\n\n/**\n * Simple download helper with CORS proxy support for development\n */\nasync function downloadResource(url: string): Promise<ArrayBuffer> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`)\n }\n return await response.arrayBuffer()\n }\n catch (err) {\n const msg = errorToMessage(err)\n throw new Error(`[downloadResource] ${url} → ${msg}`)\n }\n}\n\n/**\n * Cached download helper (in-memory)\n * Avoids duplicate network fetch for shared/template resources and repeated character loads\n */\nconst _resourceCache = new Map<string, ArrayBuffer>()\n\nasync function downloadResourceCached(url: string): Promise<ArrayBuffer> {\n const cached = _resourceCache.get(url)\n if (cached)\n return cached\n const data = await downloadResource(url)\n _resourceCache.set(url, data)\n return data\n}\n\nexport class AvatarDownloader {\n private baseAssetsPath: string\n private characterAssets: Map<string, ArrayBuffer>\n\n constructor(baseAssetsPath = '/') {\n this.baseAssetsPath = baseAssetsPath\n this.characterAssets = new Map()\n }\n\n /**\n * Load template resources from CharacterMeta flame CDN URLs\n * Falls back to global CDN config if not provided by API\n */\n async loadTemplateResources(\n flameResources?: FlameResources,\n progressCallback: ProgressCallback | null = null,\n ): Promise<TemplateResources> {\n // Determine resource URLs: use API-provided URLs if available, otherwise use global CDN config\n const useApiResources = flameResources && Object.keys(flameResources).length > 0\n\n if (!useApiResources) {\n logger.log('⚠️ FLAME resources not provided in CharacterMeta, using global CDN config')\n return this.loadGlobalFlameResources(progressCallback)\n }\n\n logger.log('✅ Using FLAME resources from CharacterMeta API')\n\n const templateFiles: Record<string, { url: string | undefined, resourceName: string }> = {\n flameModel: {\n url: flameResources.flameModel?.remote,\n resourceName: 'model.pb',\n },\n flameTemplate: {\n url: flameResources.flameTemplate?.remote,\n resourceName: 'flame_template.pb',\n },\n teethPb: {\n url: flameResources.teethPb?.remote,\n resourceName: 'teeth.pb',\n },\n teethNpz: {\n url: flameResources.teethNpz?.remote,\n resourceName: 'teeth.npz',\n },\n }\n\n const totalFiles = Object.keys(templateFiles).length\n let loadedFiles = 0\n\n const updateProgress = (filename: string, loaded: boolean): void => {\n if (progressCallback) {\n if (loaded)\n loadedFiles++\n\n progressCallback({\n stage: 'template',\n filename,\n loaded: loadedFiles,\n total: totalFiles,\n progress: Math.round((loadedFiles / totalFiles) * 100),\n })\n }\n }\n\n const templateResources: TemplateResources = {}\n\n // Load all template files in parallel from CDN\n const promises = Object.entries(templateFiles).map(async ([key, { url, resourceName }]) => {\n if (!url) {\n throw new Error(`[loadTemplateResources] Missing CDN URL for ${key} (${resourceName})`)\n }\n\n updateProgress(resourceName, false)\n\n logger.log(`📥 Loading ${key} from API CDN: ${url}`)\n const buffer = await downloadResourceCached(url)\n logger.log(`✅ ${key} loaded: ${buffer.byteLength} bytes`)\n\n templateResources[key] = buffer\n updateProgress(resourceName, true)\n })\n\n await Promise.all(promises)\n\n return templateResources\n }\n\n /**\n * Load global FLAME template resources from CDN\n * Uses centralized FLAME CDN config (shared across all characters)\n */\n private async loadGlobalFlameResources(\n progressCallback: ProgressCallback | null = null,\n ): Promise<TemplateResources> {\n const { cdnBaseUrl, resources } = APP_CONFIG.flame\n\n const templateFiles: Record<string, { url: string, resourceName: string }> = {\n flameModel: {\n url: `${cdnBaseUrl}/${resources.flameModel}`,\n resourceName: resources.flameModel,\n },\n flameTemplate: {\n url: `${cdnBaseUrl}/${resources.flameTemplate}`,\n resourceName: resources.flameTemplate,\n },\n teethPb: {\n url: `${cdnBaseUrl}/${resources.teethPb}`,\n resourceName: resources.teethPb,\n },\n teethNpz: {\n url: `${cdnBaseUrl}/${resources.teethNpz}`,\n resourceName: resources.teethNpz,\n },\n }\n\n const totalFiles = Object.keys(templateFiles).length\n let loadedFiles = 0\n\n const updateProgress = (filename: string, loaded: boolean): void => {\n if (progressCallback) {\n if (loaded)\n loadedFiles++\n\n progressCallback({\n stage: 'template',\n filename,\n loaded: loadedFiles,\n total: totalFiles,\n progress: Math.round((loadedFiles / totalFiles) * 100),\n })\n }\n }\n\n const templateResources: TemplateResources = {}\n\n // Load all template files in parallel from global CDN\n const promises = Object.entries(templateFiles).map(async ([key, { url, resourceName }]) => {\n updateProgress(resourceName, false)\n\n logger.log(`📥 Loading ${key} from global CDN: ${url}`)\n const buffer = await downloadResourceCached(url)\n logger.log(`✅ ${key} loaded: ${buffer.byteLength} bytes`)\n\n templateResources[key] = buffer\n updateProgress(resourceName, true)\n })\n\n await Promise.all(promises)\n\n return templateResources\n }\n\n /**\n * Load camera settings from CharacterMeta (optional)\n */\n async loadCameraSettings(characterMeta: CharacterMeta): Promise<PreloadCameraSettings | undefined> {\n const cameraUrl = characterMeta.camera?.resource?.remote\n if (!cameraUrl) {\n logger.log('ℹ️ No camera resource URL provided')\n return undefined\n }\n\n try {\n logger.log(`📥 Loading camera info from: ${cameraUrl}`)\n const response = await fetch(cameraUrl)\n if (!response.ok) {\n throw new Error(`Failed to fetch camera info: ${response.statusText}`)\n }\n\n const cameraSettings = await response.json() as PreloadCameraSettings\n logger.log('✅ Camera info loaded:', cameraSettings)\n return cameraSettings\n }\n catch (error) {\n logger.warn('⚠️ Failed to load camera info, using default:', error)\n return undefined\n }\n }\n\n /**\n * Load character data from CharacterMeta (iOS compatible)\n */\n async loadCharacterData(\n characterMeta: CharacterMeta,\n options?: { loadMonologue?: boolean, progressCallback?: ProgressCallback | null },\n ): Promise<CharacterDataResult> {\n const { loadMonologue = false, progressCallback = null } = options || {}\n // Extract required resource URLs\n const shapeUrl = characterMeta.models?.shape?.resource?.remote\n const pointCloudUrl = characterMeta.models?.gsStandard?.resource?.remote\n const idleAnimationUrl = characterMeta.animations?.frameIdle?.resource?.remote\n const monoAnimationUrl = characterMeta.animations?.frameMono?.resource?.remote\n const monoAudioUrl = characterMeta.animations?.audioMono?.resource?.remote\n\n if (!shapeUrl || !pointCloudUrl) {\n const reason = 'Missing required resources: shape or gsStandard (point cloud)'\n AvatarKit.logEvent('character_load', 'error', {\n characterId: characterMeta.characterId ?? 'unknown',\n stage: 'resource_validation',\n reason,\n })\n throw new Error(reason)\n }\n\n const filesToLoad: Array<{ key: string, url: string, filename: string, optional?: boolean }> = [\n { key: 'shape', url: shapeUrl, filename: 'shape.pb' },\n { key: 'pointCloud', url: pointCloudUrl, filename: 'point_cloud.ply' },\n ]\n\n // Add idle animation if available\n if (idleAnimationUrl) {\n filesToLoad.push({ key: 'idleAnimation', url: idleAnimationUrl, filename: 'idle.pb', optional: true })\n }\n\n // Add monologue animation only if explicitly requested\n if (loadMonologue && monoAnimationUrl) {\n logger.log('📥 Loading monologue animation (enabled by option)')\n filesToLoad.push({ key: 'monoAnimation', url: monoAnimationUrl, filename: 'mono.pb', optional: true })\n }\n else if (!loadMonologue && monoAnimationUrl) {\n logger.log('⏭️ Skipping monologue animation (disabled by option)')\n }\n\n let loadedFiles = 0\n const totalFiles = filesToLoad.length\n\n const updateProgress = (filename: string, loaded: boolean): void => {\n if (progressCallback) {\n if (loaded)\n loadedFiles++\n\n progressCallback({\n stage: 'character',\n filename,\n loaded: loadedFiles,\n total: totalFiles,\n progress: Math.round((loadedFiles / totalFiles) * 100),\n })\n }\n }\n\n // Download assets in parallel\n const characterData: Partial<CharacterDataResult> = {}\n\n const downloadPromises = filesToLoad.map(async ({ key, url, filename, optional }) => {\n updateProgress(filename, false)\n try {\n const arrayBuffer = await downloadResourceCached(url)\n\n if (key === 'shape') {\n characterData.shape = arrayBuffer\n }\n else if (key === 'pointCloud') {\n characterData.pointCloud = arrayBuffer\n }\n else if (key === 'idleAnimation') {\n characterData.idleAnimation = arrayBuffer\n }\n else if (key === 'monoAnimation') {\n characterData.monoAnimation = arrayBuffer\n }\n\n this.characterAssets.set(key, arrayBuffer)\n updateProgress(filename, true)\n return { key, success: true }\n }\n catch (error) {\n if (!optional) {\n throw error\n }\n logger.warn(`⚠️ Optional resource ${filename} failed to load:`, error)\n updateProgress(filename, true)\n return { key, success: false }\n }\n })\n\n await Promise.all(downloadPromises)\n\n // Save monologue audio URL only if monologue is enabled\n if (loadMonologue && monoAudioUrl) {\n characterData.monoAudioUrl = monoAudioUrl\n }\n\n if (!characterData.shape || !characterData.pointCloud) {\n const reason = 'Failed to load character data'\n AvatarKit.logEvent('character_load', 'error', {\n characterId: characterMeta.characterId ?? 'unknown',\n stage: 'download',\n reason,\n })\n throw new Error(reason)\n }\n\n return characterData as CharacterDataResult\n }\n\n /**\n * Preload all resources (template + character data + camera info + settings)\n */\n async preloadResources(\n characterMeta: CharacterMeta,\n options?: {\n loadMonologue?: boolean\n progressCallback?: ProgressCallback | null\n },\n ): Promise<PreloadResult> {\n const { loadMonologue = false, progressCallback = null } = options || {}\n\n const [templateResources, characterData, preloadCameraSettings] = await Promise.all([\n this.loadTemplateResources((characterMeta as CharacterMeta & { flame?: FlameResources }).flame, (info) => {\n if (progressCallback) {\n progressCallback({\n ...info,\n stage: `template-${info.stage}`,\n })\n }\n }),\n this.loadCharacterData(characterMeta, {\n loadMonologue,\n progressCallback: (info) => {\n if (progressCallback) {\n progressCallback({\n ...info,\n stage: `character-${info.stage}`,\n })\n }\n },\n }),\n this.loadCameraSettings(characterMeta),\n ])\n\n return {\n templateResources,\n characterData,\n preloadCameraSettings,\n characterSettings: characterMeta.characterSettings,\n }\n }\n\n /**\n * Get loaded character asset by key\n */\n getCharacterAsset(key: string): ArrayBuffer | undefined {\n return this.characterAssets.get(key)\n }\n\n /**\n * Clear cached assets\n */\n clear() {\n this.characterAssets.clear()\n }\n\n // ============ API Client Methods ============\n\n /**\n * Get Main App API Client (enjoi.spatialwalk.top)\n * Used for: character list, auth, customization, etc.\n */\n private getMainAppClient() {\n return {\n async request(url: string, options: RequestInit = {}) {\n // Get environment config from AvatarKit\n const config = AvatarKit.getEnvironmentConfig()\n const baseUrl = config.realtimeApiBaseUrl\n const fullUrl = baseUrl + url\n try {\n const response = await fetch(fullUrl, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n catch (err) {\n const msg = errorToMessage(err)\n throw new Error(`[MainAppClient] ${fullUrl} → ${msg}`)\n }\n },\n }\n }\n\n /**\n * Get SPAvatarKit SDK API Client (api.spatialwalk.top)\n * Used for: character details and resource URLs (public endpoints, no auth required)\n */\n private getSdkApiClient() {\n return {\n async request(url: string, options: RequestInit = {}) {\n // Get environment config from AvatarKit\n const config = AvatarKit.getEnvironmentConfig()\n const baseUrl = config.sdkApiBaseUrl\n const fullUrl = baseUrl + url\n try {\n const response = await fetch(fullUrl, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n catch (err) {\n const msg = errorToMessage(err)\n throw new Error(`[SdkApiClient] ${fullUrl} → ${msg}`)\n }\n },\n }\n }\n\n /**\n * Get single character by ID from SPAvatarKit SDK API (v2, iOS compatible)\n * Domain: api.spatialwalk.top\n * Auth: Public endpoint, no authentication required\n * Returns CharacterMeta with nested resource structure\n */\n async getCharacterById(characterId: string): Promise<CharacterMeta> {\n try {\n const client = this.getSdkApiClient()\n const response = await client.request(`/v2/character/${characterId}`, {\n method: 'GET',\n })\n\n return response as CharacterMeta\n }\n catch (error: unknown) {\n logger.errorWithError('Failed to fetch character:', error)\n const errorMessage = error && typeof error === 'object' && 'message' in error\n ? String((error as { message?: unknown }).message)\n : 'Failed to fetch character'\n const dataMessage = error && typeof error === 'object' && 'data' in error && typeof (error as { data?: unknown }).data === 'object' && (error as { data?: { message?: unknown } }).data?.message\n ? String((error as { data: { message?: unknown } }).data.message)\n : null\n AvatarKit.logEvent('character_load', 'error', {\n characterId: characterId ?? 'unknown',\n stage: 'fetch',\n reason: dataMessage || errorMessage,\n })\n throw new Error(dataMessage || errorMessage)\n }\n }\n\n}\n","/**\n * AvatarManager:负责数字人管理,内部协调「数字人下载」和「数字人缓存」\n */\n\nimport type { LoadProgressInfo } from '../types'\n\nimport { LoadProgress } from '../types'\nimport { logger } from '../utils/logger'\nimport { Avatar } from './Avatar'\nimport { AvatarDownloader } from './AvatarDownloader'\nimport { AvatarKit } from './AvatarKit'\n\nexport class AvatarManager {\n private static _instance: AvatarManager | null = null\n private avatarDownloader: AvatarDownloader | null = null\n private _templateInitialized: boolean = false\n\n /**\n * 通过全局单例来访问\n */\n static get shared(): AvatarManager {\n if (!this._instance) {\n this._instance = new AvatarManager()\n }\n return this._instance\n }\n\n /**\n * 加载数字人\n * @param id 数字人 ID\n * @param onProgress 进度回调\n * @param options 加载选项\n * @returns Promise<Avatar>\n */\n async load(\n id: string,\n onProgress?: (progress: LoadProgressInfo) => void,\n options?: { enableMonologue?: boolean },\n ): Promise<Avatar> {\n logger.log(`[AvatarManager] Loading avatar with id: ${id}`)\n\n try {\n // 检查AvatarKit是否已初始化\n if (!AvatarKit.isInitialized) {\n throw new Error('AvatarKit not initialized. Please call AvatarKit.initialize() first.')\n }\n\n // 1. 初始化资源下载器\n if (!this.avatarDownloader) {\n this.avatarDownloader = new AvatarDownloader()\n }\n\n // 2. 获取角色元数据\n logger.log('[AvatarManager] Step 1: Fetching character metadata...')\n onProgress?.({ type: LoadProgress.downloading, progress: 10 })\n const characterMeta = await this.avatarDownloader.getCharacterById(id)\n\n // 3. 下载资源\n logger.log('[AvatarManager] Step 2: Downloading resources...')\n onProgress?.({ type: LoadProgress.downloading, progress: 30 })\n\n const resources = await this.avatarDownloader.preloadResources(characterMeta, {\n loadMonologue: options?.enableMonologue ?? false,\n progressCallback: (info) => {\n // 将内部进度转换为外部进度 (30-80%)\n const externalProgress = 30 + (info.progress / 100) * 50\n onProgress?.({\n type: LoadProgress.downloading,\n progress: Math.round(externalProgress),\n })\n },\n })\n\n // 4. 初始化WASM Core模板资源(仅首次初始化)\n const avatarCore = AvatarKit.getAvatarCore()\n if (!avatarCore) {\n throw new Error('AvatarCore not available. AvatarKit initialization may have failed.')\n }\n\n if (!this._templateInitialized) {\n logger.log('[AvatarManager] Step 3: Initializing WASM Core template resources (first time)...')\n onProgress?.({ type: LoadProgress.downloading, progress: 80 })\n\n // 加载模板资源到WASM Core\n await avatarCore.loadTemplateResourcesFromBuffers(resources.templateResources)\n this._templateInitialized = true\n logger.log('[AvatarManager] WASM Core template resources initialized successfully')\n }\n else {\n logger.log('[AvatarManager] WASM Core template resources already initialized, skipping...')\n }\n\n // 5. 创建 Avatar 实例\n logger.log('[AvatarManager] Step 4: Creating Avatar instance...')\n const avatar = new Avatar(id, characterMeta, resources)\n\n logger.log('[AvatarManager] Avatar loaded successfully')\n onProgress?.({ type: LoadProgress.completed })\n\n // 埋点:角色加载成功\n AvatarKit.logEvent('character_load', 'info', {\n characterId: id,\n event: 'load_success',\n })\n\n return avatar\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('Failed to load avatar:', message)\n AvatarKit.logEvent('character_load', 'error', {\n characterId: id,\n reason: message,\n })\n onProgress?.({ type: LoadProgress.failed, error: error as Error })\n throw error\n }\n }\n\n /**\n * 清理资源加载器缓存\n */\n clearCache(): void {\n if (this.avatarDownloader) {\n this.avatarDownloader.clear()\n }\n }\n}\n","/**\n * Splat 深度排序(Radix Sort 优化版)\n * 使用 11-bit 两轮基数排序,O(n) 时间复杂度\n */\n\n// 复用缓冲区(避免每帧重新分配)\nlet depthBuffer: Float32Array | null = null\nlet depthInt: Uint32Array | null = null\nlet indices0: Uint32Array | null = null\nlet indices1: Uint32Array | null = null\nlet result: Uint32Array | null = null\nlet counts: Uint32Array | null = null\n\nconst BUCKET_SIZE = 2048 // 11 位 = 2^11\nconst MASK = BUCKET_SIZE - 1\n\n/**\n * 对 splats 进行深度排序(Radix Sort)\n * @param packedData Packed 格式数据 [pos3, color4, cov6] x N\n * @param cameraPosition 相机位置\n * @param cameraForward 相机前向向量\n */\nexport function sortSplats(\n packedData: Float32Array,\n cameraPosition: [number, number, number],\n cameraForward: [number, number, number],\n): Uint32Array {\n const floatsPerPoint = 13\n const splatCount = packedData.length / floatsPerPoint\n\n // 初始化或复用缓冲区\n if (!depthBuffer || depthBuffer.length !== splatCount) {\n depthBuffer = new Float32Array(splatCount)\n depthInt = new Uint32Array(depthBuffer.buffer)\n indices0 = new Uint32Array(splatCount)\n indices1 = new Uint32Array(splatCount)\n result = new Uint32Array(splatCount)\n counts = new Uint32Array(BUCKET_SIZE)\n }\n\n const depths = depthBuffer!\n const depthsInt = depthInt!\n const idx0 = indices0!\n const idx1 = indices1!\n const out = result!\n const cnt = counts!\n\n // 1. 计算深度值\n const cx = cameraPosition[0]\n const cy = cameraPosition[1]\n const cz = cameraPosition[2]\n const fx = cameraForward[0]\n const fy = cameraForward[1]\n const fz = cameraForward[2]\n\n for (let i = 0; i < splatCount; i++) {\n const offset = i * floatsPerPoint\n depths[i]\n = (packedData[offset] - cx) * fx\n + (packedData[offset + 1] - cy) * fy\n + (packedData[offset + 2] - cz) * fz\n idx0[i] = i\n }\n\n // 2. 转换深度为整数(用于基数排序)\n // 浮点数翻转负数位以保证排序正确\n for (let i = 0; i < splatCount; i++) {\n const d = depthsInt[i]\n depthsInt[i] = d ^ (-(d >> 31) | 0x80000000)\n }\n\n // 3. 第一轮:按低 11 位排序\n radixPass(depthsInt, idx0, idx1, cnt, 0, splatCount)\n\n // 4. 第二轮:按中间 11 位排序\n radixPass(depthsInt, idx1, idx0, cnt, 11, splatCount)\n\n // 5. 第三轮:按高 10 位排序(32 位总共需要 3 轮)\n radixPass(depthsInt, idx0, idx1, cnt, 22, splatCount)\n\n // 6. 翻转结果(从远到近)\n for (let i = 0; i < splatCount; i++) {\n out[i] = idx1[splatCount - 1 - i]\n }\n\n return out\n}\n\n/**\n * 基数排序单轮\n */\nfunction radixPass(\n keys: Uint32Array,\n indicesIn: Uint32Array,\n indicesOut: Uint32Array,\n counts: Uint32Array,\n shift: number,\n count: number,\n): void {\n // 清零计数\n counts.fill(0)\n\n // 统计桶\n for (let i = 0; i < count; i++) {\n const key = (keys[indicesIn[i]] >> shift) & MASK\n counts[key]++\n }\n\n // 累积计数(前缀和)\n let sum = 0\n for (let i = 0; i < BUCKET_SIZE; i++) {\n const c = counts[i]\n counts[i] = sum\n sum += c\n }\n\n // 分配到输出\n for (let i = 0; i < count; i++) {\n const idx = indicesIn[i]\n const key = (keys[idx] >> shift) & MASK\n indicesOut[counts[key]++] = idx\n }\n}\n","/**\n * Packed Data 工具函数\n *\n * Packed 格式:[pos3, color4, cov6] x N 个点\n * 每个点 13 个 float,共 52 bytes\n */\n\nconst FLOATS_PER_POINT = 13\n\n// 复用缓冲区,避免每帧分配\nlet reorderedBuffer: Float32Array | null = null\n\n/**\n * 重新排序 packed 数据(复用缓冲区)\n * @param packedData 原始数据 [pos3, color4, cov6] x N\n * @param sortOrder 排序索引数组\n * @returns 重排序后的数据(复用的缓冲区引用)\n */\nexport function reorderPackedData(\n packedData: Float32Array,\n sortOrder: Uint32Array,\n): Float32Array {\n const pointCount = sortOrder.length\n const requiredLength = pointCount * FLOATS_PER_POINT\n\n // 仅在尺寸变化时重新分配\n if (!reorderedBuffer || reorderedBuffer.length !== requiredLength) {\n reorderedBuffer = new Float32Array(requiredLength)\n }\n\n // 复用缓冲区\n for (let i = 0; i < pointCount; i++) {\n const srcIdx = sortOrder[i]\n const srcOffset = srcIdx * FLOATS_PER_POINT\n const dstOffset = i * FLOATS_PER_POINT\n\n for (let j = 0; j < FLOATS_PER_POINT; j++) {\n reorderedBuffer[dstOffset + j] = packedData[srcOffset + j]\n }\n }\n\n return reorderedBuffer\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_relativePosition;\\nin vec4 v_color;\\n\\nout vec4 fragColor;\\n\\nconst float BOUNDS_RADIUS = 3.0;\\nconst float BOUNDS_RADIUS_SQUARED = BOUNDS_RADIUS * BOUNDS_RADIUS;\\n\\nfloat splatFragmentAlpha(vec2 relativePosition, float splatAlpha) {\\n // ✅ 修复:完全匹配MetalSplatter的计算方式\\n float negativeMagnitudeSquared = -dot(relativePosition, relativePosition);\\n\\n // 边界检查:超出椭圆边界的点被剔除\\n if (negativeMagnitudeSquared < -BOUNDS_RADIUS_SQUARED) {\\n return 0.0;\\n }\\n\\n // ✅ 修复:高斯衰减,使用MetalSplatter的公式 exp(0.5 * negative)\\n return exp(0.5 * negativeMagnitudeSquared) * splatAlpha;\\n}\\n\\nvoid main() {\\n float alpha = splatFragmentAlpha(v_relativePosition, v_color.a);\\n\\n // 预乘 alpha 输出(匹配 premultipliedAlpha: true)\\n // 颜色值需要乘以 alpha,这样 WebGL 才能正确混合\\n fragColor = vec4(v_color.rgb * alpha, alpha);\\n}\"","export default \"#version 300 es\\nprecision highp float;\\n\\n// 基础四边形顶点属性(共享4个顶点)\\nlayout(location = 0) in vec2 a_quadVertex; // (-1,-1), (-1,1), (1,-1), (1,1)\\n\\n// 实例化属性(每个splat实例)\\nlayout(location = 1) in vec3 a_position; // splat中心位置\\nlayout(location = 2) in vec4 a_color; // RGBA颜色\\nlayout(location = 3) in vec3 a_covA; // 协方差矩阵上三角\\nlayout(location = 4) in vec3 a_covB; // 协方差矩阵下三角\\n\\n// Uniform变量\\nuniform mat4 u_viewMatrix;\\nuniform mat4 u_projectionMatrix;\\nuniform vec2 u_screenSize;\\nuniform int u_enableFrustumCulling;\\n\\n// 输出到片段着色器\\nout vec2 v_relativePosition;\\nout vec4 v_color;\\n\\n// 常量定义\\nconst float BOUNDS_RADIUS = 3.0;\\n\\n/**\\n * 计算2D协方差矩阵(复刻Metal版本)\\n */\\nvec3 calcCovariance2D(vec3 viewPos, vec3 cov3Da, vec3 cov3Db, mat4 viewMatrix, mat4 projectionMatrix, vec2 screenSize) {\\n float invViewPosZ = 1.0 / viewPos.z;\\n float invViewPosZSquared = invViewPosZ * invViewPosZ;\\n\\n // FOV限制\\n float tanHalfFovX = 1.0 / projectionMatrix[0][0];\\n float tanHalfFovY = 1.0 / projectionMatrix[1][1];\\n float limX = 1.3 * tanHalfFovX;\\n float limY = 1.3 * tanHalfFovY;\\n\\n viewPos.x = clamp(viewPos.x * invViewPosZ, -limX, limX) * viewPos.z;\\n viewPos.y = clamp(viewPos.y * invViewPosZ, -limY, limY) * viewPos.z;\\n\\n // 焦距计算\\n float focalX = screenSize.x * projectionMatrix[0][0] / 2.0;\\n float focalY = screenSize.y * projectionMatrix[1][1] / 2.0;\\n\\n // 雅可比矩阵 J\\n mat3 J = mat3(\\n focalX * invViewPosZ, 0.0, 0.0,\\n 0.0, focalY * invViewPosZ, 0.0,\\n -(focalX * viewPos.x) * invViewPosZSquared, -(focalY * viewPos.y) * invViewPosZSquared, 0.0\\n );\\n\\n // 视图变换矩阵 W (仅旋转部分) - 固定使用转置(经验最清晰)\\n mat3 W = transpose(mat3(viewMatrix[0].xyz, viewMatrix[1].xyz, viewMatrix[2].xyz));\\n\\n // 投影变换 T = J * W\\n mat3 T = J * W;\\n\\n // 3D协方差矩阵 Vrk\\n mat3 Vrk = mat3(\\n cov3Da.x, cov3Da.y, cov3Da.z,\\n cov3Da.y, cov3Db.x, cov3Db.y,\\n cov3Da.z, cov3Db.y, cov3Db.z\\n );\\n\\n // 2D协方差矩阵\\n mat3 cov = T * Vrk * transpose(T);\\n\\n // 低通滤波器\\n cov[0][0] += 0.3;\\n cov[1][1] += 0.3;\\n\\n return vec3(cov[0][0], cov[0][1], cov[1][1]);\\n}\\n\\n/**\\n * 分解协方差矩阵\\n */\\nvoid decomposeCovariance(vec3 cov2D, out vec2 v1, out vec2 v2) {\\n float a = cov2D.x;\\n float b = cov2D.y;\\n float d = cov2D.z;\\n\\n float det = a * d - b * b;\\n float trace = a + d;\\n\\n float mean = 0.5 * trace;\\n float dist = max(0.1, sqrt(mean * mean - det));\\n\\n // 特征值\\n float lambda1 = mean + dist;\\n float lambda2 = mean - dist;\\n\\n // 确保特征值为正\\n lambda1 = max(lambda1, 0.01);\\n lambda2 = max(lambda2, 0.01);\\n\\n // 特征向量 - 完全复刻MetalSplatter的算法\\n vec2 eigenvector1;\\n if (abs(b) < 1e-6) {\\n eigenvector1 = (a > d) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\\n } else {\\n // ✅ 修复:使用MetalSplatter的公式 (b, d - lambda2) 而不是 (b, lambda1 - a)\\n eigenvector1 = normalize(vec2(b, d - lambda2));\\n }\\n\\n // ✅ 修复:正交特征向量,使用MetalSplatter的方向 (y, -x) 而不是 (-y, x)\\n vec2 eigenvector2 = vec2(eigenvector1.y, -eigenvector1.x);\\n\\n v1 = eigenvector1 * sqrt(lambda1);\\n v2 = eigenvector2 * sqrt(lambda2);\\n}\\n\\nvoid main() {\\n // 直接使用原始位置数据,不进行硬编码缩放\\n vec3 scaledPosition = a_position;\\n\\n // 转换到视图空间\\n vec4 viewPosition4 = u_viewMatrix * vec4(scaledPosition, 1.0);\\n vec3 viewPosition3 = viewPosition4.xyz;\\n\\n // 计算2D协方差矩阵\\n vec3 cov2D = calcCovariance2D(viewPosition3, a_covA, a_covB, u_viewMatrix, u_projectionMatrix, u_screenSize);\\n\\n // 分解协方差矩阵\\n vec2 axis1, axis2;\\n decomposeCovariance(cov2D, axis1, axis2);\\n\\n // 投影到屏幕空间\\n vec4 projectedCenter = u_projectionMatrix * viewPosition4;\\n\\n // 视锥体剔除(对齐MetalSplatter边界,可调试禁用)\\n if (u_enableFrustumCulling == 1) {\\n float bounds = 1.2 * projectedCenter.w;\\n if (projectedCenter.z < 0.0 ||\\n projectedCenter.z > projectedCenter.w ||\\n projectedCenter.x < -bounds ||\\n projectedCenter.x > bounds ||\\n projectedCenter.y < -bounds ||\\n projectedCenter.y > bounds) {\\n // 剔除到屏幕外\\n gl_Position = vec4(1.0, 1.0, 0.0, 1.0);\\n return;\\n }\\n }\\n\\n // 使用实例化的四边形顶点\\n vec2 relativeCoord = a_quadVertex;\\n\\n // 计算椭圆变换后的相对位置(像素单位)\\n vec2 ellipseRelativePos = relativeCoord.x * axis1 + relativeCoord.y * axis2;\\n\\n // 计算屏幕空间偏移\\n vec2 screenSizeFloat = u_screenSize;\\n vec2 projectedScreenDelta = ellipseRelativePos * 2.0 * BOUNDS_RADIUS / screenSizeFloat;\\n\\n // 最终顶点位置\\n gl_Position = vec4(\\n projectedCenter.x + projectedScreenDelta.x * projectedCenter.w,\\n projectedCenter.y + projectedScreenDelta.y * projectedCenter.w,\\n projectedCenter.z,\\n projectedCenter.w\\n );\\n\\n // 传递标准化坐标给片段着色器(椭圆内[-1,1]范围)\\n v_relativePosition = relativeCoord * BOUNDS_RADIUS;\\n v_color = a_color;\\n}\"","/**\n * WebGL 3DGS 渲染器\n */\n\nimport type { I3DGSRenderer } from '../renderer'\n\nimport { logger } from '../../utils/logger'\nimport fragmentShaderSource from './fragment.glsl?raw'\nimport vertexShaderSource from './vertex.glsl?raw'\n\nexport class WebGLRenderer implements I3DGSRenderer {\n private canvas: HTMLCanvasElement\n private backgroundColor: [number, number, number, number]\n private gl: WebGL2RenderingContext | null\n private shaderProgram: WebGLProgram | null\n private uniformLocations: Record<string, WebGLUniformLocation | null>\n private attributeLocations: Record<string, number>\n\n private splatBuffer: WebGLBuffer | null\n private quadVertexBuffer: WebGLBuffer | null\n private vertexArray: WebGLVertexArrayObject | null\n\n private splatCount: number\n private isInitialized: boolean\n private splatBufferSize: number // 跟踪当前 buffer 大小\n\n constructor(canvas: HTMLCanvasElement, backgroundColor?: [number, number, number, number]) {\n this.canvas = canvas\n this.backgroundColor = backgroundColor || [0, 0, 0, 0] // 默认透明背景\n\n // WebGL 上下文和程序\n this.gl = null\n this.shaderProgram = null\n this.uniformLocations = {}\n this.attributeLocations = {}\n\n // 缓冲区\n this.splatBuffer = null\n this.quadVertexBuffer = null\n this.vertexArray = null\n\n // 渲染状态\n this.splatCount = 0\n this.isInitialized = false\n this.splatBufferSize = 0\n }\n\n /**\n * 初始化 WebGL 渲染器\n */\n async initialize(): Promise<void> {\n try {\n // 创建 WebGL2 上下文\n this.gl = this.canvas.getContext('webgl2', {\n antialias: false,\n alpha: true, // 启用透明度,让 CSS 背景透出\n premultipliedAlpha: true,\n powerPreference: 'high-performance',\n preserveDrawingBuffer: false,\n })\n\n if (!this.gl) {\n throw new Error('WebGL2 not supported')\n }\n\n const gl = this.gl\n\n // 创建着色器程序\n this.shaderProgram = this.createShaderProgram(gl)\n\n // 获取 uniform 和 attribute 位置\n this.setupShaderLocations()\n\n // 设置 WebGL 状态\n this.setupWebGLState()\n\n // 创建缓冲区\n this.createBuffers()\n\n this.isInitialized = true\n }\n catch (error) {\n logger.error(`WebGLRenderer initialize failed: ${error instanceof Error ? error.message : String(error)}`)\n throw error\n }\n }\n\n /**\n * 设置着色器位置\n */\n private setupShaderLocations() {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n const program = this.shaderProgram\n if (!program)\n throw new Error('Shader program not initialized')\n\n this.uniformLocations = {\n viewMatrix: gl.getUniformLocation(program, 'u_viewMatrix'),\n projectionMatrix: gl.getUniformLocation(program, 'u_projectionMatrix'),\n screenSize: gl.getUniformLocation(program, 'u_screenSize'),\n enableFrustumCulling: gl.getUniformLocation(program, 'u_enableFrustumCulling'),\n }\n\n this.attributeLocations = {\n quadVertex: 0, // a_quadVertex (共享四边形顶点)\n position: 1, // a_position (实例化)\n color: 2, // a_color (实例化)\n covA: 3, // a_covA (实例化)\n covB: 4, // a_covB (实例化)\n }\n }\n\n /**\n * 设置 WebGL 渲染状态\n */\n private setupWebGLState() {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n gl.disable(gl.DEPTH_TEST)\n gl.depthMask(true)\n gl.enable(gl.BLEND)\n // 预乘 alpha 混合(匹配 premultipliedAlpha: true)\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n // 透明背景,让 CSS 背景透出\n gl.clearColor(0.0, 0.0, 0.0, 0.0)\n }\n\n /**\n * 创建渲染缓冲区\n */\n private createBuffers() {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n // 创建实例化渲染 VAO 和缓冲区\n this.vertexArray = gl.createVertexArray()\n this.splatBuffer = gl.createBuffer()\n this.createQuadVertexBuffer()\n }\n\n /**\n * 创建四边形顶点缓冲区(实例化渲染用)\n */\n private createQuadVertexBuffer() {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n // 四边形顶点(2D 坐标,将被实例化)\n const quadVertices = new Float32Array([\n -1.0,\n -1.0, // 左下\n -1.0,\n 1.0, // 左上\n 1.0,\n -1.0, // 右下\n 1.0,\n 1.0, // 右上\n ])\n\n this.quadVertexBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer)\n gl.bufferData(gl.ARRAY_BUFFER, quadVertices, gl.STATIC_DRAW)\n }\n\n /**\n * 从已打包数据加载(零拷贝,GPU 优化路径)\n * 🚀 性能优化版本:直接使用 WASM 输出的 packed 数据\n * 🚀 Buffer 复用:避免每帧重新分配,使用 bufferSubData 更新\n * @param packedData Float32Array [pos3, color4, cov6] x N 个点\n * @param pointCount 点数\n * @param _sortOrder WebGL 忽略此参数(已在 RenderSystem 中重排序)\n */\n loadSplatsFromPackedData(packedData: Float32Array, pointCount: number, _sortOrder?: Uint32Array) {\n if (!this.isInitialized) {\n throw new Error('Renderer not initialized')\n }\n\n this.splatCount = pointCount\n\n // 直接上传\n this.uploadToGPU(packedData)\n }\n\n /**\n * 上传数据到 GPU\n */\n private uploadToGPU(packedData: Float32Array) {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.splatBuffer)\n\n // 只在 buffer 不存在或大小变化时重新分配\n if (this.splatBufferSize !== packedData.byteLength) {\n gl.bufferData(gl.ARRAY_BUFFER, packedData, gl.DYNAMIC_DRAW)\n this.splatBufferSize = packedData.byteLength\n }\n else {\n // 使用 bufferSubData 更新数据(无需重新分配)\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, packedData)\n }\n }\n\n /**\n * 设置实例化渲染顶点属性\n */\n private setupVertexAttributes() {\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n // 绑定 VAO\n gl.bindVertexArray(this.vertexArray)\n\n // 设置共享四边形顶点属性\n gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer)\n gl.enableVertexAttribArray(this.attributeLocations.quadVertex)\n gl.vertexAttribPointer(\n this.attributeLocations.quadVertex,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n )\n\n // 设置实例化 splat 属性\n gl.bindBuffer(gl.ARRAY_BUFFER, this.splatBuffer)\n\n const floatsPerSplat = 13\n const bytesPerFloat = 4\n const strideBytes = floatsPerSplat * bytesPerFloat\n\n // Position 属性 (location 1)\n gl.enableVertexAttribArray(this.attributeLocations.position)\n gl.vertexAttribPointer(\n this.attributeLocations.position,\n 3,\n gl.FLOAT,\n false,\n strideBytes,\n 0,\n )\n gl.vertexAttribDivisor(this.attributeLocations.position, 1)\n\n // Color 属性 (location 2)\n gl.enableVertexAttribArray(this.attributeLocations.color)\n gl.vertexAttribPointer(\n this.attributeLocations.color,\n 4,\n gl.FLOAT,\n false,\n strideBytes,\n 3 * bytesPerFloat,\n )\n gl.vertexAttribDivisor(this.attributeLocations.color, 1)\n\n // CovA 属性 (location 3)\n gl.enableVertexAttribArray(this.attributeLocations.covA)\n gl.vertexAttribPointer(\n this.attributeLocations.covA,\n 3,\n gl.FLOAT,\n false,\n strideBytes,\n 7 * bytesPerFloat,\n )\n gl.vertexAttribDivisor(this.attributeLocations.covA, 1)\n\n // CovB 属性 (location 4)\n gl.enableVertexAttribArray(this.attributeLocations.covB)\n gl.vertexAttribPointer(\n this.attributeLocations.covB,\n 3,\n gl.FLOAT,\n false,\n strideBytes,\n 10 * bytesPerFloat,\n )\n gl.vertexAttribDivisor(this.attributeLocations.covB, 1)\n }\n\n /**\n * 渲染一帧\n */\n render(\n viewMatrix: Float32Array,\n projectionMatrix: Float32Array,\n screenSize: [number, number],\n ) {\n if (!this.isInitialized || this.splatCount === 0) {\n return\n }\n\n const gl = this.gl\n if (!gl)\n throw new Error('WebGL context not initialized')\n\n gl.viewport(0, 0, screenSize[0], screenSize[1])\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n\n // 使用实例化着色器\n gl.useProgram(this.shaderProgram)\n\n // 设置 uniform 变量\n gl.uniformMatrix4fv(this.uniformLocations.viewMatrix, false, viewMatrix)\n gl.uniformMatrix4fv(this.uniformLocations.projectionMatrix, false, projectionMatrix)\n gl.uniform2fv(this.uniformLocations.screenSize, screenSize)\n gl.uniform1i(this.uniformLocations.enableFrustumCulling, 1)\n\n // 设置顶点属性\n this.setupVertexAttributes()\n\n // 实例化绘制\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.splatCount)\n }\n\n /**\n * 创建着色器程序\n */\n private createShaderProgram(gl: WebGL2RenderingContext): WebGLProgram {\n // 编译顶点着色器\n const vertexShader = gl.createShader(gl.VERTEX_SHADER)\n if (!vertexShader)\n throw new Error('Failed to create vertex shader')\n\n gl.shaderSource(vertexShader, vertexShaderSource)\n gl.compileShader(vertexShader)\n\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(vertexShader)\n gl.deleteShader(vertexShader)\n throw new Error(`Vertex shader compilation failed: ${info}`)\n }\n\n // 编译片段着色器\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)\n if (!fragmentShader) {\n gl.deleteShader(vertexShader)\n throw new Error('Failed to create fragment shader')\n }\n\n gl.shaderSource(fragmentShader, fragmentShaderSource)\n gl.compileShader(fragmentShader)\n\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(fragmentShader)\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n throw new Error(`Fragment shader compilation failed: ${info}`)\n }\n\n // 链接着色器程序\n const program = gl.createProgram()\n if (!program) {\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n throw new Error('Failed to create shader program')\n }\n\n gl.attachShader(program, vertexShader)\n gl.attachShader(program, fragmentShader)\n gl.linkProgram(program)\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(program)\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n gl.deleteProgram(program)\n throw new Error(`Shader program linking failed: ${info}`)\n }\n\n // 清理着色器对象\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n\n return program\n }\n\n /**\n * 清理资源\n */\n dispose() {\n if (!this.gl)\n return\n\n const gl = this.gl\n\n // 删除缓冲区\n if (this.splatBuffer)\n gl.deleteBuffer(this.splatBuffer)\n if (this.quadVertexBuffer)\n gl.deleteBuffer(this.quadVertexBuffer)\n if (this.vertexArray)\n gl.deleteVertexArray(this.vertexArray)\n\n // 删除着色器程序\n if (this.shaderProgram)\n gl.deleteProgram(this.shaderProgram)\n\n // Optionally lose the context to aggressively free VRAM\n try {\n const lose = gl.getExtension('WEBGL_lose_context') as { loseContext?: () => void } | null\n if (lose && typeof lose.loseContext === 'function') {\n lose.loseContext()\n }\n }\n catch {\n // best-effort only\n }\n\n this.isInitialized = false\n }\n}\n","export default \"/**\\n * WebGPU 3DGS 渲染着色器\\n *\\n * 实例化渲染:每个 splat 绘制一个四边形\\n * 对应 WebGL 版本的 GLSL 着色器\\n */\\n\\n// ============ Uniform Bindings ============\\n\\nstruct Uniforms {\\n viewMatrix: mat4x4f,\\n projectionMatrix: mat4x4f,\\n screenSize: vec2f,\\n enableFrustumCulling: u32,\\n}\\n\\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\\n\\n// ============ Storage Buffer Bindings (间接索引渲染) ============\\n\\n@group(1) @binding(0) var<storage, read> sortIndices: array<u32>;\\n@group(1) @binding(1) var<storage, read> splatData: array<f32>;\\n\\n// ============ Vertex Shader ============\\n\\nstruct VertexInput {\\n // 共享四边形顶点 (per-vertex)\\n @location(0) quadVertex: vec2f,\\n}\\n\\nstruct VertexOutput {\\n @builtin(position) position: vec4f,\\n @location(0) relativePosition: vec2f,\\n @location(1) color: vec4f,\\n}\\n\\n// 常量定义\\nconst BOUNDS_RADIUS: f32 = 3.0;\\n\\n/**\\n * 计算2D协方差矩阵(复刻 WebGL 版本)\\n */\\nfn calcCovariance2D(\\n viewPos: vec3f,\\n cov3Da: vec3f,\\n cov3Db: vec3f,\\n viewMatrix: mat4x4f,\\n projectionMatrix: mat4x4f,\\n screenSize: vec2f\\n) -> vec3f {\\n let invViewPosZ = 1.0 / viewPos.z;\\n let invViewPosZSquared = invViewPosZ * invViewPosZ;\\n\\n // FOV 限制\\n let tanHalfFovX = 1.0 / projectionMatrix[0][0];\\n let tanHalfFovY = 1.0 / projectionMatrix[1][1];\\n let limX = 1.3 * tanHalfFovX;\\n let limY = 1.3 * tanHalfFovY;\\n\\n var clampedViewPos = viewPos;\\n clampedViewPos.x = clamp(viewPos.x * invViewPosZ, -limX, limX) * viewPos.z;\\n clampedViewPos.y = clamp(viewPos.y * invViewPosZ, -limY, limY) * viewPos.z;\\n\\n // 焦距计算\\n let focalX = screenSize.x * projectionMatrix[0][0] / 2.0;\\n let focalY = screenSize.y * projectionMatrix[1][1] / 2.0;\\n\\n // 雅可比矩阵 J\\n let J = mat3x3f(\\n focalX * invViewPosZ, 0.0, -(focalX * clampedViewPos.x) * invViewPosZSquared,\\n 0.0, focalY * invViewPosZ, -(focalY * clampedViewPos.y) * invViewPosZSquared,\\n 0.0, 0.0, 0.0\\n );\\n\\n // 视图变换矩阵 W (仅旋转部分) - 转置\\n let W = transpose(mat3x3f(\\n viewMatrix[0].xyz,\\n viewMatrix[1].xyz,\\n viewMatrix[2].xyz\\n ));\\n\\n // 投影变换 T = J * W\\n let T = J * W;\\n\\n // 3D 协方差矩阵 Vrk(对称矩阵)\\n let Vrk = mat3x3f(\\n cov3Da.x, cov3Da.y, cov3Da.z,\\n cov3Da.y, cov3Db.x, cov3Db.y,\\n cov3Da.z, cov3Db.y, cov3Db.z\\n );\\n\\n // 2D 协方差矩阵: cov = T * Vrk * T^T\\n let cov = T * Vrk * transpose(T);\\n\\n // 低通滤波器\\n var result = vec3f(cov[0][0], cov[0][1], cov[1][1]);\\n result.x += 0.3;\\n result.z += 0.3;\\n\\n return result;\\n}\\n\\n/**\\n * 分解协方差矩阵\\n */\\nfn decomposeCovariance(cov2D: vec3f) -> array<vec2f, 2> {\\n let a = cov2D.x;\\n let b = cov2D.y;\\n let d = cov2D.z;\\n\\n let det = a * d - b * b;\\n let trace = a + d;\\n\\n let mean = 0.5 * trace;\\n let dist = max(0.1, sqrt(mean * mean - det));\\n\\n // 特征值\\n var lambda1 = mean + dist;\\n var lambda2 = mean - dist;\\n\\n // 确保特征值为正\\n lambda1 = max(lambda1, 0.01);\\n lambda2 = max(lambda2, 0.01);\\n\\n // 特征向量(复刻 WebGL MetalSplatter 算法)\\n var eigenvector1: vec2f;\\n if (abs(b) < 1e-6) {\\n eigenvector1 = select(vec2f(0.0, 1.0), vec2f(1.0, 0.0), a > d);\\n } else {\\n eigenvector1 = normalize(vec2f(b, d - lambda2));\\n }\\n\\n // 正交特征向量\\n let eigenvector2 = vec2f(eigenvector1.y, -eigenvector1.x);\\n\\n let v1 = eigenvector1 * sqrt(lambda1);\\n let v2 = eigenvector2 * sqrt(lambda2);\\n\\n return array<vec2f, 2>(v1, v2);\\n}\\n\\n@vertex\\nfn vertexMain(\\n input: VertexInput,\\n @builtin(instance_index) instanceIndex: u32\\n) -> VertexOutput {\\n var output: VertexOutput;\\n\\n // 🚀 间接索引:通过排序索引读取实际数据\\n let sortedIdx = sortIndices[instanceIndex];\\n let dataOffset = sortedIdx * 13u;\\n\\n // 从 storage buffer 读取 splat 数据\\n let position = vec3f(\\n splatData[dataOffset + 0u],\\n splatData[dataOffset + 1u],\\n splatData[dataOffset + 2u]\\n );\\n let color = vec4f(\\n splatData[dataOffset + 3u],\\n splatData[dataOffset + 4u],\\n splatData[dataOffset + 5u],\\n splatData[dataOffset + 6u]\\n );\\n let covA = vec3f(\\n splatData[dataOffset + 7u],\\n splatData[dataOffset + 8u],\\n splatData[dataOffset + 9u]\\n );\\n let covB = vec3f(\\n splatData[dataOffset + 10u],\\n splatData[dataOffset + 11u],\\n splatData[dataOffset + 12u]\\n );\\n\\n // 转换到视图空间\\n let viewPosition4 = uniforms.viewMatrix * vec4f(position, 1.0);\\n let viewPosition3 = viewPosition4.xyz;\\n\\n // 计算 2D 协方差矩阵\\n let cov2D = calcCovariance2D(\\n viewPosition3,\\n covA,\\n covB,\\n uniforms.viewMatrix,\\n uniforms.projectionMatrix,\\n uniforms.screenSize\\n );\\n\\n // 分解协方差矩阵\\n let axes = decomposeCovariance(cov2D);\\n let axis1 = axes[0];\\n let axis2 = axes[1];\\n\\n // 投影到屏幕空间\\n let projectedCenter = uniforms.projectionMatrix * viewPosition4;\\n\\n // 视锥体剔除\\n if (uniforms.enableFrustumCulling == 1u) {\\n let bounds = 1.2 * projectedCenter.w;\\n if (projectedCenter.z < 0.0 ||\\n projectedCenter.z > projectedCenter.w ||\\n projectedCenter.x < -bounds ||\\n projectedCenter.x > bounds ||\\n projectedCenter.y < -bounds ||\\n projectedCenter.y > bounds) {\\n // 剔除到屏幕外\\n output.position = vec4f(2.0, 2.0, 0.0, 1.0);\\n output.relativePosition = vec2f(0.0);\\n output.color = vec4f(0.0);\\n return output;\\n }\\n }\\n\\n // 使用实例化的四边形顶点\\n let relativeCoord = input.quadVertex;\\n\\n // 计算椭圆变换后的相对位置(像素单位)\\n let ellipseRelativePos = relativeCoord.x * axis1 + relativeCoord.y * axis2;\\n\\n // 计算屏幕空间偏移\\n let projectedScreenDelta = ellipseRelativePos * 2.0 * BOUNDS_RADIUS / uniforms.screenSize;\\n\\n // 最终顶点位置\\n output.position = vec4f(\\n projectedCenter.x + projectedScreenDelta.x * projectedCenter.w,\\n projectedCenter.y + projectedScreenDelta.y * projectedCenter.w,\\n projectedCenter.z,\\n projectedCenter.w\\n );\\n\\n // 传递给 fragment shader\\n output.relativePosition = relativeCoord * BOUNDS_RADIUS;\\n output.color = color;\\n\\n return output;\\n}\\n\\n// ============ Fragment Shader ============\\n\\nconst BOUNDS_RADIUS_SQUARED: f32 = BOUNDS_RADIUS * BOUNDS_RADIUS;\\n\\nfn splatFragmentAlpha(relativePosition: vec2f, splatAlpha: f32) -> f32 {\\n // 复刻 WebGL MetalSplatter 计算方式\\n let negativeMagnitudeSquared = -dot(relativePosition, relativePosition);\\n\\n // 边界检查:超出椭圆边界的点被剔除\\n if (negativeMagnitudeSquared < -BOUNDS_RADIUS_SQUARED) {\\n return 0.0;\\n }\\n\\n // 高斯衰减\\n return exp(0.5 * negativeMagnitudeSquared) * splatAlpha;\\n}\\n\\n@fragment\\nfn fragmentMain(input: VertexOutput) -> @location(0) vec4f {\\n let alpha = splatFragmentAlpha(input.relativePosition, input.color.a);\\n\\n // 预乘 alpha 输出(匹配 alphaMode: 'premultiplied')\\n return vec4f(input.color.rgb * alpha, alpha);\\n}\\n\"","/**\n * WebGPU 3DGS 渲染器\n */\n\nimport type { I3DGSRenderer } from '../renderer'\n\nimport renderShaderCode from './render.wgsl?raw'\n\nexport class WebGPURenderer implements I3DGSRenderer {\n private canvas: HTMLCanvasElement\n private backgroundColor: [number, number, number, number]\n private device: GPUDevice | null = null\n private context: GPUCanvasContext | null = null\n private renderPipeline: GPURenderPipeline | null = null\n private quadVertexBuffer: GPUBuffer | null = null\n private uniformBuffer: GPUBuffer | null = null\n private uniformBindGroup: GPUBindGroup | null = null\n\n // 🚀 间接索引渲染 buffers\n private sortIndexBuffer: GPUBuffer | null = null\n private splatDataBuffer: GPUBuffer | null = null\n private storageBindGroup: GPUBindGroup | null = null\n private lastSortOrder: Uint32Array | null = null // 缓存上次的排序索引\n private bindGroupNeedsUpdate = false // 标记 bind group 是否需要更新\n\n private splatCount = 0\n private presentationFormat: GPUTextureFormat = 'bgra8unorm'\n\n constructor(canvas: HTMLCanvasElement, backgroundColor?: [number, number, number, number]) {\n this.canvas = canvas\n this.backgroundColor = backgroundColor || [0, 0, 0, 0] // 默认透明背景\n }\n\n /**\n * 初始化 WebGPU 渲染器\n */\n async initialize(): Promise<void> {\n // 1. 获取 GPU adapter\n const adapter = await navigator.gpu.requestAdapter({\n powerPreference: 'high-performance',\n })\n if (!adapter) {\n throw new Error('WebGPU: No GPU adapter found')\n }\n\n // 2. 请求 device\n this.device = await adapter.requestDevice()\n\n // 3. 配置 canvas context\n this.context = this.canvas.getContext('webgpu')\n if (!this.context) {\n throw new Error('WebGPU: Failed to get canvas context')\n }\n\n this.presentationFormat = navigator.gpu.getPreferredCanvasFormat()\n this.context.configure({\n device: this.device,\n format: this.presentationFormat,\n alphaMode: 'premultiplied',\n })\n\n // 4. 创建 uniform buffer\n this.createUniformBuffer()\n\n // 5. 创建 quad vertex buffer(共享四边形)\n this.createQuadVertexBuffer()\n\n // 6. 创建 render pipeline\n await this.createRenderPipeline()\n }\n\n /**\n * 创建 Uniform Buffer\n */\n private createUniformBuffer(): void {\n if (!this.device)\n return\n\n // Uniform 结构:\n // - viewMatrix: mat4x4f (64 bytes)\n // - projectionMatrix: mat4x4f (64 bytes)\n // - screenSize: vec2f (8 bytes) + padding 8 bytes\n // - enableFrustumCulling: u32 (4 bytes) + padding 12 bytes\n // Total: 160 bytes\n\n const uniformBufferSize = 160\n\n this.uniformBuffer = this.device.createBuffer({\n label: 'Uniform Buffer',\n size: uniformBufferSize,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n })\n }\n\n /**\n * 创建四边形顶点缓冲区(实例化渲染用)\n */\n private createQuadVertexBuffer(): void {\n if (!this.device)\n return\n\n const quadVertices = new Float32Array([\n -1.0,\n -1.0, // 左下\n -1.0,\n 1.0, // 左上\n 1.0,\n -1.0, // 右下\n 1.0,\n 1.0, // 右上\n ])\n\n this.quadVertexBuffer = this.device.createBuffer({\n label: 'Quad Vertex Buffer',\n size: quadVertices.byteLength,\n usage: GPUBufferUsage.VERTEX,\n mappedAtCreation: true,\n })\n\n new Float32Array(this.quadVertexBuffer.getMappedRange()).set(quadVertices)\n this.quadVertexBuffer.unmap()\n }\n\n /**\n * 创建 Render Pipeline\n */\n private async createRenderPipeline(): Promise<void> {\n if (!this.device)\n return\n\n // 创建 shader module\n const shaderModule = this.device.createShaderModule({\n label: '3DGS Render Shader',\n code: renderShaderCode,\n })\n\n // Bind Group 0: Uniforms\n const uniformBindGroupLayout = this.device.createBindGroupLayout({\n label: 'Uniform Bind Group Layout',\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX,\n buffer: { type: 'uniform' },\n },\n ],\n })\n\n // Bind Group 1: Storage Buffers (间接索引)\n const storageBindGroupLayout = this.device.createBindGroupLayout({\n label: 'Storage Bind Group Layout',\n entries: [\n {\n binding: 0, // sortIndices\n visibility: GPUShaderStage.VERTEX,\n buffer: { type: 'read-only-storage' },\n },\n {\n binding: 1, // splatData\n visibility: GPUShaderStage.VERTEX,\n buffer: { type: 'read-only-storage' },\n },\n ],\n })\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: 'Render Pipeline Layout',\n bindGroupLayouts: [uniformBindGroupLayout, storageBindGroupLayout],\n })\n\n // Vertex buffer layouts (只保留 quad vertices)\n const vertexBufferLayouts: GPUVertexBufferLayout[] = [\n // Buffer 0: Quad vertices (per-vertex)\n {\n arrayStride: 8, // 2 floats\n stepMode: 'vertex',\n attributes: [\n {\n shaderLocation: 0, // quadVertex\n offset: 0,\n format: 'float32x2',\n },\n ],\n },\n ]\n\n // Create render pipeline\n this.renderPipeline = this.device.createRenderPipeline({\n label: '3DGS Render Pipeline',\n layout: pipelineLayout,\n vertex: {\n module: shaderModule,\n entryPoint: 'vertexMain',\n buffers: vertexBufferLayouts,\n },\n fragment: {\n module: shaderModule,\n entryPoint: 'fragmentMain',\n targets: [\n {\n format: this.presentationFormat,\n blend: {\n // 预乘 alpha 混合(匹配 alphaMode: 'premultiplied')\n color: {\n srcFactor: 'one',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n alpha: {\n srcFactor: 'one',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n },\n },\n ],\n },\n primitive: {\n topology: 'triangle-strip',\n stripIndexFormat: undefined,\n },\n depthStencil: undefined, // 3DGS 不使用深度测试\n })\n\n // 创建 uniform bind group (group 0)\n this.uniformBindGroup = this.device.createBindGroup({\n label: 'Uniform Bind Group',\n layout: uniformBindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: this.uniformBuffer! },\n },\n ],\n })\n\n // storage bind group 将在 loadSplatsFromPackedData 中创建\n }\n\n /**\n * 从已打包数据加载\n * 🚀 间接索引渲染:packedData 是原始数据,sortOrder 是排序索引\n * 🚀 完全消除 CPU 重排序开销\n */\n loadSplatsFromPackedData(\n packedData: Float32Array,\n pointCount: number,\n sortOrder?: Uint32Array,\n ): void {\n if (!this.device)\n throw new Error('Device not initialized')\n\n this.splatCount = pointCount\n\n // 1. 创建或更新 splat data buffer\n if (!this.splatDataBuffer || this.splatDataBuffer.size !== packedData.byteLength) {\n if (this.splatDataBuffer) {\n this.splatDataBuffer.destroy()\n }\n\n this.splatDataBuffer = this.device.createBuffer({\n label: 'Splat Data Buffer',\n size: packedData.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n })\n this.bindGroupNeedsUpdate = true // buffer 重建,需要更新 bind group\n }\n\n // 上传原始数据\n this.device.queue.writeBuffer(\n this.splatDataBuffer,\n 0,\n packedData.buffer,\n packedData.byteOffset,\n packedData.byteLength,\n )\n\n // 2. 创建或更新 sort index buffer\n if (sortOrder) {\n const indexBufferSize = sortOrder.byteLength\n\n // 检查是否需要更新索引(避免重复上传相同数据)\n const sortOrderChanged = !this.lastSortOrder || sortOrder !== this.lastSortOrder\n\n if (!this.sortIndexBuffer || this.sortIndexBuffer.size !== indexBufferSize) {\n if (this.sortIndexBuffer) {\n this.sortIndexBuffer.destroy()\n }\n\n this.sortIndexBuffer = this.device.createBuffer({\n label: 'Sort Index Buffer',\n size: indexBufferSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n })\n this.bindGroupNeedsUpdate = true // buffer 重建,需要更新 bind group\n }\n\n // 只在排序索引变化时上传\n if (sortOrderChanged) {\n this.device.queue.writeBuffer(\n this.sortIndexBuffer,\n 0,\n sortOrder.buffer,\n sortOrder.byteOffset,\n sortOrder.byteLength,\n )\n this.lastSortOrder = sortOrder\n }\n\n // 3. 创建或更新 storage bind group (group 1)\n if (this.bindGroupNeedsUpdate && this.renderPipeline && this.sortIndexBuffer && this.splatDataBuffer) {\n const storageBindGroupLayout = this.renderPipeline.getBindGroupLayout(1)\n\n this.storageBindGroup = this.device.createBindGroup({\n label: 'Storage Bind Group',\n layout: storageBindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: this.sortIndexBuffer },\n },\n {\n binding: 1,\n resource: { buffer: this.splatDataBuffer },\n },\n ],\n })\n this.bindGroupNeedsUpdate = false\n }\n }\n }\n\n /**\n * 渲染一帧\n */\n render(\n viewMatrix: Float32Array,\n projectionMatrix: Float32Array,\n screenSize: [number, number],\n ): void {\n if (!this.device || !this.context || !this.renderPipeline)\n return\n if (this.splatCount === 0 || !this.storageBindGroup)\n return\n\n // 更新 uniform buffer\n this.updateUniforms(viewMatrix, projectionMatrix, screenSize)\n\n // 获取当前 texture\n const textureView = this.context.getCurrentTexture().createView()\n\n // 创建 command encoder\n const commandEncoder = this.device.createCommandEncoder({\n label: 'Render Command Encoder',\n })\n\n const renderPass = commandEncoder.beginRenderPass({\n label: 'Render Pass',\n colorAttachments: [\n {\n view: textureView,\n // 透明清屏以便 CSS 背景透出\n clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n })\n\n renderPass.setPipeline(this.renderPipeline)\n renderPass.setBindGroup(0, this.uniformBindGroup!) // Uniforms\n renderPass.setBindGroup(1, this.storageBindGroup!) // Storage buffers (间接索引)\n renderPass.setVertexBuffer(0, this.quadVertexBuffer!) // Quad vertices\n renderPass.draw(4, this.splatCount) // 4 vertices per quad, N instances\n\n renderPass.end()\n\n // Submit\n this.device.queue.submit([commandEncoder.finish()])\n }\n\n /**\n * 更新 Uniform Buffer\n */\n private updateUniforms(\n viewMatrix: Float32Array,\n projectionMatrix: Float32Array,\n screenSize: [number, number],\n ): void {\n if (!this.device || !this.uniformBuffer)\n return\n\n // 准备 uniform 数据(160 bytes)\n const uniformData = new ArrayBuffer(160)\n const float32View = new Float32Array(uniformData)\n const uint32View = new Uint32Array(uniformData)\n\n // viewMatrix (16 floats, 64 bytes)\n float32View.set(viewMatrix, 0)\n\n // projectionMatrix (16 floats, 64 bytes)\n float32View.set(projectionMatrix, 16)\n\n // screenSize (2 floats, 8 bytes) + padding 8 bytes\n float32View[32] = screenSize[0]\n float32View[33] = screenSize[1]\n\n // enableFrustumCulling (u32, 4 bytes) + padding 12 bytes\n uint32View[36] = 1 // true\n\n // 写入 buffer\n this.device.queue.writeBuffer(this.uniformBuffer, 0, uniformData)\n }\n\n /**\n * 清理资源\n */\n dispose(): void {\n this.sortIndexBuffer?.destroy()\n this.splatDataBuffer?.destroy()\n this.quadVertexBuffer?.destroy()\n this.uniformBuffer?.destroy()\n this.device?.destroy()\n\n this.sortIndexBuffer = null\n this.splatDataBuffer = null\n this.quadVertexBuffer = null\n this.uniformBuffer = null\n this.uniformBindGroup = null\n this.storageBindGroup = null\n this.device = null\n this.context = null\n this.renderPipeline = null\n }\n}\n","/**\n * 渲染系统 - 统一管理 WebGL/WebGPU 渲染\n *\n * 职责:\n * 1. 自动选择渲染后端 (WebGPU 优先,不支持则回退 WebGL)\n * 2. 相机管理\n * 3. 矩阵计算\n */\n\nimport type { CameraConfig } from '../types'\nimport type { I3DGSRenderer, RenderBackend } from './renderer'\n\nimport { logger } from '../utils/logger'\nimport { sortSplats } from './sortSplats'\nimport { reorderPackedData } from './webgl/reorderData'\nimport { WebGLRenderer } from './webgl/webglRenderer'\nimport { WebGPURenderer } from './webgpu/webgpuRenderer'\n\nexport interface RenderSystemOptions {\n canvas: HTMLCanvasElement\n preferBackend?: RenderBackend\n backgroundColor?: [number, number, number, number]\n camera?: CameraConfig\n}\n\nexport class RenderSystem {\n private renderer: I3DGSRenderer | null = null\n private backend: RenderBackend | null = null\n private canvas: HTMLCanvasElement\n private options: RenderSystemOptions\n\n // 相机配置\n private camera: CameraConfig & {\n up: [number, number, number]\n aspect: number\n }\n\n // 矩阵缓存(复用缓冲区,避免每帧分配)\n private viewMatrix = new Float32Array(16)\n private projectionMatrix = new Float32Array(16)\n\n // 当前数据(GPU 格式:[pos3, color4, cov6] x N)\n private originalPackedData: Float32Array | null = null\n\n // 性能统计\n public renderTime = 0 // 总渲染耗时\n public sortTime = 0 // 排序耗时\n\n constructor(options: RenderSystemOptions) {\n this.options = options\n this.canvas = options.canvas\n\n // 初始化相机(从配置或使用默认值)\n const cameraConfig = options.camera || {\n position: [-0.02, -0.013, 1.5],\n target: [0, 0, 0],\n fov: 22,\n near: 0.01,\n far: 100,\n }\n\n this.camera = {\n ...cameraConfig,\n up: [0, 1, 0],\n aspect: 1,\n }\n }\n\n /**\n * 初始化渲染系统\n */\n async initialize(): Promise<void> {\n const { preferBackend, backgroundColor = [0, 0, 0, 0] } = this.options // 默认透明背景\n\n if (preferBackend !== 'webgl') {\n const webgpuSupported = await this.checkWebGPUSupport()\n if (webgpuSupported) {\n try {\n this.renderer = new WebGPURenderer(this.canvas, backgroundColor)\n await this.renderer.initialize()\n this.backend = 'webgpu'\n logger.log('✅ Using WebGPU renderer')\n this.updateCameraAspect()\n return\n }\n catch (err) {\n logger.warn('⚠️ WebGPU init failed, fallback to WebGL:', err)\n }\n }\n }\n\n this.renderer = new WebGLRenderer(this.canvas, backgroundColor)\n await this.renderer.initialize()\n this.backend = 'webgl'\n logger.log('✅ Using WebGL renderer')\n this.updateCameraAspect()\n }\n\n /**\n * 加载已打包的 Splat 数据(零拷贝,GPU 格式)\n * 直接接收 WASM 的 packed 数据\n *\n * @param packedData Float32Array [pos3, color4, cov6] x N 个点\n */\n loadSplatsFromPackedData(packedData: Float32Array): void {\n if (!this.renderer)\n throw new Error('Renderer not initialized')\n\n // 保存原始数据\n this.originalPackedData = packedData\n }\n\n /**\n * 渲染一帧\n */\n renderFrame(): void {\n if (!this.renderer || !this.originalPackedData)\n return\n\n const startRender = performance.now()\n\n this.updateCameraMatrices()\n\n const pointCount = Math.floor(this.originalPackedData.length / 13)\n\n // 计算排序索引(直接从 packed data 读取 position,无需提取)\n const startSort = performance.now()\n const sortOrder = sortSplats(\n this.originalPackedData,\n this.camera.position,\n this.getCameraForward(),\n )\n this.sortTime = performance.now() - startSort\n\n // 根据后端类型决定如何传递数据\n if (this.backend === 'webgpu') {\n // WebGPU: 传递原始数据 + 排序索引(GPU 间接索引渲染)\n this.renderer.loadSplatsFromPackedData(this.originalPackedData, pointCount, sortOrder)\n }\n else {\n // WebGL: 传递 CPU 重排序后的数据\n const reorderedData = reorderPackedData(this.originalPackedData, sortOrder)\n this.renderer.loadSplatsFromPackedData(reorderedData, pointCount)\n }\n\n // 渲染\n this.renderer.render(\n this.viewMatrix,\n this.projectionMatrix,\n [this.canvas.width, this.canvas.height],\n )\n\n this.renderTime = performance.now() - startRender\n }\n\n /**\n * 更新相机参数\n */\n updateCamera(params: Partial<CameraConfig>): void {\n Object.assign(this.camera, params)\n this.updateCameraAspect()\n }\n\n /**\n * 处理窗口大小变化\n */\n handleResize(): void {\n this.updateCameraAspect()\n }\n\n /**\n * 获取当前使用的后端\n */\n getBackend(): RenderBackend | null {\n return this.backend\n }\n\n /**\n * 清理资源\n */\n dispose(): void {\n this.renderer?.dispose()\n this.renderer = null\n }\n\n // ========== 私有方法 ==========\n\n /**\n * 检查 WebGPU 支持\n */\n private async checkWebGPUSupport(): Promise<boolean> {\n if (!navigator.gpu)\n return false\n try {\n const adapter = await navigator.gpu.requestAdapter()\n return adapter !== null\n }\n catch {\n return false\n }\n }\n\n /**\n * 更新相机长宽比\n */\n private updateCameraAspect(): void {\n this.camera.aspect = this.canvas.width / this.canvas.height\n }\n\n /**\n * 更新相机矩阵\n */\n private updateCameraMatrices(): void {\n const { position, target, up } = this.camera\n\n this.updatePerspectiveMatrix(\n this.camera.fov,\n this.camera.aspect,\n this.camera.near,\n this.camera.far,\n )\n\n this.updateViewMatrix(position, target, up)\n }\n\n /**\n * 获取相机前向向量\n */\n private getCameraForward(): [number, number, number] {\n const forward: [number, number, number] = [\n this.camera.target[0] - this.camera.position[0],\n this.camera.target[1] - this.camera.position[1],\n this.camera.target[2] - this.camera.position[2],\n ]\n\n const length = Math.sqrt(\n forward[0] ** 2 + forward[1] ** 2 + forward[2] ** 2,\n )\n if (length > 0) {\n forward[0] /= length\n forward[1] /= length\n forward[2] /= length\n }\n\n return forward\n }\n\n /**\n * 更新透视投影矩阵(复用缓冲区)\n */\n private updatePerspectiveMatrix(\n fov: number,\n aspect: number,\n near: number,\n far: number,\n ): void {\n const fovYRadians = (fov * Math.PI) / 180\n const f = 1.0 / Math.tan(fovYRadians / 2)\n const zs = far / (near - far)\n\n const m = this.projectionMatrix\n m[0] = f / aspect\n m[1] = 0\n m[2] = 0\n m[3] = 0\n m[4] = 0\n m[5] = f\n m[6] = 0\n m[7] = 0\n m[8] = 0\n m[9] = 0\n m[10] = zs\n m[11] = -1\n m[12] = 0\n m[13] = 0\n m[14] = zs * near\n m[15] = 0\n }\n\n /**\n * 更新视图矩阵(直接更新预分配的缓冲区,避免每帧分配)\n * 等价于:inverse(translation) * inverse(rotation) = T^(-1) * R^(-1)\n * 其中 T 是平移矩阵,R 是旋转矩阵\n */\n private updateViewMatrix(\n position: [number, number, number],\n target: [number, number, number],\n up: [number, number, number],\n ): void {\n // 计算前向向量(从 position 指向 target)\n const forward: [number, number, number] = [\n target[0] - position[0],\n target[1] - position[1],\n target[2] - position[2],\n ]\n const fLen = Math.hypot(forward[0], forward[1], forward[2]) || 1\n forward[0] /= fLen\n forward[1] /= fLen\n forward[2] /= fLen\n\n // 计算右向量(forward × up)\n const right: [number, number, number] = [\n forward[1] * up[2] - forward[2] * up[1],\n forward[2] * up[0] - forward[0] * up[2],\n forward[0] * up[1] - forward[1] * up[0],\n ]\n const rLen = Math.hypot(right[0], right[1], right[2]) || 1\n right[0] /= rLen\n right[1] /= rLen\n right[2] /= rLen\n\n // 计算上向量(right × forward)\n const newUp: [number, number, number] = [\n right[1] * forward[2] - right[2] * forward[1],\n right[2] * forward[0] - right[0] * forward[2],\n right[0] * forward[1] - right[1] * forward[0],\n ]\n\n // 旋转矩阵 R(列主序):[right, newUp, -forward]\n // 旋转矩阵的逆 R^(-1) = R^T(转置)\n // 平移矩阵的逆 T^(-1):平移 -position\n // 视图矩阵 = T^(-1) * R^(-1)\n // 对于列主序矩阵乘法 T^(-1) * R^(-1):\n // - 前三列 = R^T 的前三列(因为 T^(-1) 的前三列是单位矩阵)\n // - 第四列 = T^(-1) * R^T 的第四列 = T^(-1) * [0, 0, 0, 1]^T = [-px, -py, -pz, 1]\n const m = this.viewMatrix\n const px = -position[0]\n const py = -position[1]\n const pz = -position[2]\n\n // 前三列:R^T(旋转矩阵的转置)\n m[0] = right[0]\n m[1] = newUp[0]\n m[2] = -forward[0]\n m[3] = 0\n m[4] = right[1]\n m[5] = newUp[1]\n m[6] = -forward[1]\n m[7] = 0\n m[8] = right[2]\n m[9] = newUp[2]\n m[10] = -forward[2]\n m[11] = 0\n\n // 第四列:T^(-1) * R^T 的第四列 = T^(-1) * [0, 0, 0, 1]^T = [-px, -py, -pz, 1]\n m[12] = px\n m[13] = py\n m[14] = pz\n m[15] = 1\n }\n}\n","/**\n * Animation Interpolation Utilities (SDK)\n * Linear interpolation with cosine easing between Flame frames\n * Aligned with app implementation and iOS behavior\n */\n\nimport type { Flame } from '../generated/driveningress/v1/driveningress'\n\nfunction lerpArrays(from: number[], to: number[], progress: number): number[] {\n const length = Math.min(from.length, to.length)\n const result: number[] = Array.from({ length })\n for (let i = 0; i < length; i++) {\n result[i] = from[i] + (to[i] - from[i]) * progress\n }\n return result\n}\n\n/**\n * Linear interpolation with cosine easing (ease-in-ease-out)\n * 0.5 - cos(progress * π) * 0.5\n */\nexport function linearLerp(from: Flame, to: Flame, progress: number): Flame {\n const easedProgress = 0.5 - Math.cos(progress * Math.PI) * 0.5\n\n return {\n translation: lerpArrays(from.translation || [0, 0, 0], to.translation || [0, 0, 0], easedProgress),\n rotation: lerpArrays(from.rotation || [0, 0, 0], to.rotation || [0, 0, 0], easedProgress),\n neckPose: lerpArrays(from.neckPose || [0, 0, 0], to.neckPose || [0, 0, 0], easedProgress),\n jawPose: lerpArrays(from.jawPose || [0, 0, 0], to.jawPose || [0, 0, 0], easedProgress),\n eyePose: lerpArrays(from.eyePose || [0, 0, 0, 0, 0, 0], to.eyePose || [0, 0, 0, 0, 0, 0], easedProgress),\n eyeLid: (() => {\n const fromEyelid = from.eyeLid\n const toEyelid = to.eyeLid\n if (fromEyelid && fromEyelid.length > 0 && toEyelid && toEyelid.length > 0)\n return lerpArrays(fromEyelid, toEyelid, easedProgress)\n return fromEyelid || toEyelid || []\n })(),\n expression: lerpArrays(from.expression || [], to.expression || [], easedProgress),\n }\n}\n\n/**\n * Generate transition keyframes between two Flame states\n * @param durationMs Transition duration (e.g. 400ms)\n * @param fps Frames per second (default 25)\n */\nexport function generateTransitionFrames(\n from: Flame,\n to: Flame,\n durationMs: number,\n fps = 25,\n): Flame[] {\n const steps = Math.max(1, Math.floor((durationMs / 1000) * fps))\n const frames: Flame[] = Array.from({ length: steps })\n for (let i = 0; i < steps; i++) {\n const progress = i / (steps - 1)\n frames[i] = linearLerp(from, to, progress)\n }\n return frames\n}\n\n/**\n * Create a neutral Flame\n */\nexport function createNeutralFlame(): Flame {\n return {\n translation: [0, 0, 0],\n rotation: [0, 0, 0],\n neckPose: [0, 0, 0],\n jawPose: [0, 0, 0],\n eyePose: [0, 0, 0, 0, 0, 0],\n eyeLid: [0, 0],\n expression: [],\n }\n}\n","/**\n * AvatarView:数字人视图\n * 构造函数内部使用 Avatar 实例来创建 AvatarController 实例\n * 由 SDK 内部来维护 AvatarController 实例的生命周期,并开放给开发者来控制数字人行为和监听事件\n */\n\nimport type { Flame } from '../generated/driveningress/v1/driveningress'\nimport type { CameraConfig, RenderPerformanceStats, AvatarViewOptions } from '../types'\nimport { AvatarPlaybackMode } from '../types'\nimport type { CharacterMeta } from '../types/character'\nimport type { CameraSettings } from '../types/character-settings'\nimport type { PreloadResult } from './AvatarDownloader'\nimport type { Avatar } from './Avatar'\n\nimport { APP_CONFIG } from '../config/app-config'\nimport { convertProtoFlameToWasmParams, convertWasmParamsToProtoFlame } from '../animation/utils/flameConverter'\nimport { RenderSystem } from '../renderer/RenderSystem'\nimport { generateTransitionFrames } from '../utils/animation-interpolation'\nimport { logger } from '../utils/logger'\nimport { AvatarKit } from './AvatarKit'\nimport { AvatarController } from './AvatarController'\n\nexport class AvatarView {\n private readonly avatarController: AvatarController\n public readonly playbackMode: AvatarPlaybackMode\n private readonly avatar: Avatar\n\n // Canvas and rendering\n private canvas: HTMLCanvasElement\n private renderSystem: RenderSystem | null = null\n private isInitialized: boolean = false\n private cameraConfig: CameraConfig | null = null\n\n // Realtime animation state\n private isRealtimePlaying: boolean = false\n private currentKeyframes: Flame[] = []\n private lastRenderedFrameIndex: number = -1\n private lastRealtimeProtoFrame: Flame | null = null\n private idleResumeIndexPending: number | null = null\n\n // Animation loop types\n private idleAnimationLoopId: number | null = null\n private realtimeAnimationLoopId: number | null = null\n private resizeObserver: ResizeObserver | null = null\n private onWindowResize = () => this.handleResize()\n\n // Transition (Idle -> Speaking) independent sequence\n private transitionKeyframes: Flame[] = []\n private isTransitioning: boolean = false\n private transitionStartTime: number = 0\n private readonly transitionDurationMs: number = 200\n private endToIdleAfterTransition: boolean = false\n private cachedIdleFirstFrame: Flame | null = null\n private idleCurrentFrameIndex: number = 0\n\n /**\n * 对齐两端 Flame 维度:标量统一长度,expression 取最大长度并零填充\n */\n private alignFlamePair(from: Flame, to: Flame): { from: Flame, to: Flame } {\n const ensureLen = (arr: number[] | undefined, len: number): number[] => {\n const a = Array.isArray(arr) ? arr.slice(0, len) : []\n while (a.length < len) a.push(0)\n return a\n }\n const fromFixed = {\n translation: ensureLen(from?.translation, 3),\n rotation: ensureLen(from?.rotation, 3),\n neckPose: ensureLen(from?.neckPose, 3),\n jawPose: ensureLen(from?.jawPose, 3),\n eyePose: ensureLen(from?.eyePose, 6),\n eyeLid: ensureLen(from?.eyeLid, 2),\n expression: Array.isArray(from?.expression) ? from.expression.slice() : [],\n }\n const toFixed = {\n translation: ensureLen(to?.translation, 3),\n rotation: ensureLen(to?.rotation, 3),\n neckPose: ensureLen(to?.neckPose, 3),\n jawPose: ensureLen(to?.jawPose, 3),\n eyePose: ensureLen(to?.eyePose, 6),\n eyeLid: ensureLen(to?.eyeLid, 2),\n expression: Array.isArray(to?.expression) ? to.expression.slice() : [],\n }\n const exprLen = Math.max(fromFixed.expression.length, toFixed.expression.length)\n fromFixed.expression = ensureLen(fromFixed.expression, exprLen)\n toFixed.expression = ensureLen(toFixed.expression, exprLen)\n return { from: fromFixed, to: toFixed }\n }\n\n /**\n * 判断是否为空 Flame(用于跳过 isLast=true 的哨兵帧)\n */\n private isEmptyFlame(frame: Flame): boolean {\n if (!frame)\n return true\n const arrs = [\n frame.translation,\n frame.rotation,\n frame.neckPose,\n frame.jawPose,\n frame.eyePose,\n frame.eyeLid,\n frame.expression,\n ]\n return arrs.every((a: number[] | undefined) => !a || a.length === 0)\n }\n\n /**\n * 生成并对齐过渡帧,确保首尾帧与起止帧完全一致\n */\n private generateAndAlignTransitionFrames(from: Flame, to: Flame): Flame[] {\n const aligned = this.alignFlamePair(from, to)\n let keyframes = generateTransitionFrames(\n aligned.from,\n aligned.to,\n this.transitionDurationMs,\n APP_CONFIG.animation.fps,\n )\n\n if (keyframes.length < 2) {\n keyframes = [aligned.from, aligned.to]\n }\n\n // 强制首尾帧与起止帧一致,避免边界离散\n keyframes[0] = aligned.from\n keyframes[keyframes.length - 1] = aligned.to\n\n return keyframes\n }\n\n /**\n * 获取缓存的 Idle 首帧,如果未缓存则获取并缓存\n */\n private async getCachedIdleFirstFrame(): Promise<Flame | null> {\n if (!this.cachedIdleFirstFrame) {\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore) {\n try {\n const idle0Params = await avatarCore.getCurrentFrameParams(0)\n this.cachedIdleFirstFrame = convertWasmParamsToProtoFlame(idle0Params)\n }\n catch (e) {\n logger.warn('[AvatarView] Failed to get idle first frame:', e instanceof Error ? e.message : String(e))\n }\n }\n }\n return this.cachedIdleFirstFrame\n }\n\n /**\n * 构造函数\n * 创建统一的 AvatarController,内部根据配置自动组合网络层\n */\n constructor(\n avatar: Avatar,\n options?: AvatarViewOptions\n ) {\n // 保存 avatar 引用\n this.avatar = avatar\n\n // 创建统一的 AvatarController,内部根据配置自动组合网络层\n const mode = options?.playbackMode ?? AvatarPlaybackMode.network\n this.playbackMode = mode\n this.avatarController = new AvatarController(avatar, {\n playbackMode: mode\n })\n\n // 设置渲染回调:播放层调用此回调来通知渲染层渲染\n this.avatarController.setRenderCallback((splatData, frameIndex) => {\n this.renderRealtimeFrame(splatData, frameIndex)\n })\n\n // 设置过渡完成回调:过渡完成后通知播放层启动音频\n this.avatarController.setTransitionCompleteCallback(() => {\n this.onTransitionComplete()\n })\n\n // 创建自己管理的canvas\n this.canvas = this.createCanvas(options?.container)\n\n // 初始化渲染和动画系统\n this.initializeView(avatar)\n\n // 监听 AvatarController 的事件\n this.setupControllerEventListeners()\n }\n\n /**\n * 获取控制器(公共接口)\n */\n get controller(): AvatarController {\n return this.avatarController\n }\n\n /**\n * 创建canvas元素\n */\n private createCanvas(container?: HTMLElement): HTMLCanvasElement {\n const canvas = document.createElement('canvas')\n\n // 获取容器尺寸\n let containerWidth = 800\n let containerHeight = 600\n\n if (container && container instanceof HTMLElement) {\n containerWidth = container.offsetWidth || 800\n containerHeight = container.offsetHeight || 600\n }\n\n // Canvas 保持 1:1 宽高比,使用容器的最小尺寸\n const canvasSize = Math.min(containerWidth, containerHeight)\n\n // 设置 Canvas 内部尺寸(实际渲染分辨率)\n const dpr = window.devicePixelRatio || 1\n canvas.width = Math.floor(canvasSize * dpr)\n canvas.height = Math.floor(canvasSize * dpr)\n\n // 设置 Canvas 显示尺寸(CSS 像素尺寸,保持 1:1)\n canvas.style.width = `${canvasSize}px`\n canvas.style.height = `${canvasSize}px`\n canvas.style.display = 'block'\n canvas.style.margin = '0 auto'\n // 去除绝对定位,保持标准文档流(与线上一致)\n canvas.style.position = ''\n canvas.style.top = ''\n canvas.style.left = ''\n canvas.style.zIndex = ''\n canvas.style.background = 'none'\n canvas.style.border = 'none'\n\n if (container && container instanceof HTMLElement) {\n // 如果提供了容器,添加到容器中\n container.appendChild(canvas)\n // 设置容器为 flex 布局,使 canvas 居中\n container.style.display = 'flex'\n container.style.justifyContent = 'center'\n container.style.alignItems = 'center'\n container.style.position = 'relative'\n\n // 监听容器尺寸变化,更新画布分辨率并通知渲染系统\n this.resizeObserver = new ResizeObserver(() => {\n const dpr = window.devicePixelRatio || 1\n const w = Math.floor(container.offsetWidth || 0)\n const h = Math.floor(container.offsetHeight || 0)\n // Canvas 保持 1:1 宽高比\n const canvasSize = Math.min(w, h)\n canvas.width = Math.floor(canvasSize * dpr)\n canvas.height = Math.floor(canvasSize * dpr)\n // 同步 CSS 尺寸为像素值\n canvas.style.width = `${canvasSize}px`\n canvas.style.height = `${canvasSize}px`\n this.handleResize()\n })\n this.resizeObserver.observe(container)\n }\n else {\n // 如果没有提供容器,添加到body\n document.body.appendChild(canvas)\n }\n\n // 兜底监听窗口尺寸变化\n window.addEventListener('resize', this.onWindowResize)\n\n return canvas\n }\n\n /**\n * 获取canvas元素(供外部访问)\n */\n getCanvas(): HTMLCanvasElement {\n return this.canvas\n }\n\n /**\n * 初始化视图系统\n */\n private async initializeView(avatar: Avatar): Promise<void> {\n try {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Initializing avatar view...')\n\n // 获取AvatarCore实例\n const avatarCore = AvatarKit.getAvatarCore()\n if (!avatarCore) {\n throw new Error('AvatarCore not available. AvatarKit initialization may have failed.')\n }\n\n // 获取资源数据\n const resources = avatar.getResources()\n\n // 加载角色数据\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Loading character data...')\n await avatarCore.loadCharacterFromBuffers(\n resources.characterData.shape,\n resources.characterData.pointCloud,\n )\n\n // 加载idle动画(如果可用)\n if (resources.characterData.idleAnimation) {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Loading idle animation...')\n await avatarCore.loadAnimationFromBuffer(resources.characterData.idleAnimation)\n }\n\n // 初始化渲染系统(相机配置优先从 resources.preloadCameraSettings 获取)\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Initializing render system...')\n const cameraConfig = this.resolveCameraConfig(resources)\n await this.initializeRenderSystem(cameraConfig)\n\n // 开始渲染\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Starting rendering...')\n await this.renderFirstFrame()\n this.startIdleAnimationLoop()\n\n this.isInitialized = true\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Avatar view initialized successfully')\n }\n catch (error) {\n logger.error('[AvatarView] Failed to initialize avatar view:', error instanceof Error ? error.message : String(error))\n throw error\n }\n }\n\n /**\n * 初始化渲染系统\n */\n private async initializeRenderSystem(cameraInfo?: CameraConfig): Promise<void> {\n // 相机配置优先级:优先使用资源中的配置,不存在时使用默认静态配置\n this.cameraConfig = cameraInfo || this.getDefaultCameraConfig()\n\n if (cameraInfo) {\n logger.log('[AvatarView] Using resolved camera config:', cameraInfo)\n }\n else {\n logger.log('[AvatarView] No camera config in resources, using default static config:', this.cameraConfig)\n }\n\n // 创建RenderSystem实例\n this.renderSystem = new RenderSystem({\n canvas: this.canvas,\n camera: this.cameraConfig,\n backgroundColor: [0, 0, 0, 0], // 透明背景,让 CSS 背景透出\n })\n\n // 初始化渲染系统\n await this.renderSystem.initialize()\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Render system initialized successfully')\n }\n\n /**\n * 获取默认相机配置\n */\n private getDefaultCameraConfig(): CameraConfig {\n // 直接使用 APP_CONFIG.camera(包含 near: 0.01, far: 100,与 iOS 对齐)\n return { ...APP_CONFIG.camera }\n }\n\n /**\n * 根据资源解析最终的相机配置,优先使用角色设置,其次 camera.json\n */\n private resolveCameraConfig(resources: PreloadResult): CameraConfig {\n const defaultCamera = this.getDefaultCameraConfig()\n const characterCameraSettings = resources.characterSettings?.camera ?? null\n const preloadCameraSettings = resources.preloadCameraSettings?.camera ?? null\n\n const candidateSettings = characterCameraSettings ?? preloadCameraSettings\n\n if (!candidateSettings) {\n logger.warn('[AvatarView] Camera settings not found in resources, falling back to default camera config')\n return defaultCamera\n }\n\n const source: 'characterSettings' | 'camera.json' = characterCameraSettings ? 'characterSettings' : 'camera.json'\n return this.deriveCameraConfigFromSettings(candidateSettings, defaultCamera, source)\n }\n\n /**\n * 从角色设置中推导相机配置\n */\n private deriveCameraConfigFromSettings(\n cameraSettings: CameraSettings,\n fallback: CameraConfig,\n source: 'characterSettings' | 'camera.json',\n ): CameraConfig {\n const safeValue = (value: number | undefined, fallbackValue: number): number =>\n Number.isFinite(value) ? (value as number) : fallbackValue\n\n const translationX = safeValue(cameraSettings.translationX, fallback.position[0])\n const translationY = safeValue(cameraSettings.translationY, fallback.position[1])\n const translationZ = safeValue(cameraSettings.translationZ, fallback.position[2])\n const yaw = safeValue(cameraSettings.rotation, 0)\n const fovRadians = safeValue(cameraSettings.fovYRadians, 0)\n\n const hasCustomTranslation = Math.hypot(translationX, translationY, translationZ) > 1e-4\n const hasCustomFov = fovRadians > 0\n const hasCustomRotation = Math.abs(yaw) > 1e-4\n\n if (!hasCustomTranslation && !hasCustomFov && !hasCustomRotation) {\n logger.warn(`[AvatarView] Camera settings from ${source} appear empty, falling back to default config`)\n return fallback\n }\n\n const sinYaw = Math.sin(yaw)\n const cosYaw = Math.cos(yaw)\n\n const position: [number, number, number] = hasCustomTranslation\n ? [translationX, translationY, translationZ]\n : [...fallback.position]\n\n const forward: [number, number, number] = [\n -sinYaw,\n 0,\n -cosYaw,\n ]\n\n const forwardLength = Math.hypot(forward[0], forward[1], forward[2]) || 1\n const normalizedForward: [number, number, number] = [\n forward[0] / forwardLength,\n forward[1] / forwardLength,\n forward[2] / forwardLength,\n ]\n\n const target: [number, number, number] = [\n position[0] + normalizedForward[0],\n position[1] + normalizedForward[1],\n position[2] + normalizedForward[2],\n ]\n\n const up: [number, number, number] = [0, 1, 0]\n const fov = hasCustomFov ? (fovRadians * 180) / Math.PI : fallback.fov\n\n const derivedCamera: CameraConfig = {\n ...fallback, // 自动继承 near/far 等配置(来自 APP_CONFIG.camera)\n position,\n target,\n up,\n fov,\n // near/far 从 fallback 继承,无需硬编码\n }\n\n logger.log('[AvatarView] Applied camera settings from resources', {\n source,\n translation: [translationX, translationY, translationZ],\n yawRadians: yaw,\n position,\n target,\n fov,\n near: derivedCamera.near,\n far: derivedCamera.far,\n })\n\n return derivedCamera\n }\n\n /**\n * 渲染第一帧\n */\n private async renderFirstFrame(): Promise<void> {\n if (!this.renderSystem) {\n throw new Error('Render system not initialized')\n }\n\n // 获取AvatarCore实例\n const avatarCore = AvatarKit.getAvatarCore()\n if (!avatarCore) {\n throw new Error('AvatarCore not available')\n }\n\n // 计算第一帧(使用中性参数)\n const neutralParams = {\n shape_params: Array.from({ length: 100 }, () => 0),\n expr_params: Array.from({ length: 50 }, () => 0),\n rotation: [0, 0, 0],\n translation: [0, 0, 0],\n neck_pose: [0, 0, 0],\n jaw_pose: [0, 0, 0],\n eyes_pose: [0, 0, 0, 0, 0, 0],\n }\n\n // 计算第一帧的splat数据\n const splatData = await avatarCore.computeFrameFlatFromParams(neutralParams)\n if (splatData) {\n this.renderSystem.loadSplatsFromPackedData(splatData)\n\n // 渲染第一帧\n this.renderSystem.renderFrame()\n\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] First frame rendered successfully')\n }\n else {\n throw new Error('Failed to compute first frame splat data')\n }\n }\n\n /**\n * 开始idle动画循环\n */\n private startIdleAnimationLoop(): void {\n if (this.idleAnimationLoopId) {\n return // 已经在运行\n }\n // 若实时渲染已开启,不启动 Idle 循环\n if (this.isRealtimePlaying) {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Skip starting idle loop because realtime is playing')\n return\n }\n\n this.idleCurrentFrameIndex = 0\n let lastTime = 0\n const targetFPS = 25 // 动画目标帧率(通常为25fps)\n const frameInterval = 1000 / targetFPS // 每帧间隔(毫秒)\n\n const renderFrame = async (currentTime: number) => {\n try {\n if (!this.renderSystem) {\n return\n }\n\n // 如果正在播放实时对话,暂停idle动画\n if (this.isRealtimePlaying) {\n this.idleAnimationLoopId = requestAnimationFrame(renderFrame)\n return\n }\n\n // 控制动画帧率\n if (currentTime - lastTime < frameInterval) {\n this.idleAnimationLoopId = requestAnimationFrame(renderFrame)\n return\n }\n lastTime = currentTime\n\n // 获取AvatarCore实例\n const avatarCore = AvatarKit.getAvatarCore()\n if (!avatarCore) {\n return\n }\n\n // Idle动画模式:使用递增的帧索引\n const splatData = await avatarCore.computeCompleteFrameFlat({ frameIndex: this.idleCurrentFrameIndex })\n this.idleCurrentFrameIndex++\n\n if (splatData) {\n // 避免在状态切换帧仍渲染 Idle\n if (this.isRealtimePlaying) {\n return\n }\n // 加载splat数据到渲染系统\n this.renderSystem.loadSplatsFromPackedData(splatData)\n // 渲染当前帧(Idle)\n this.renderSystem.renderFrame()\n }\n\n // 继续下一帧\n this.idleAnimationLoopId = requestAnimationFrame(renderFrame)\n }\n catch (error) {\n logger.error('[AvatarView] Idle animation loop error:', error instanceof Error ? error.message : String(error))\n this.stopIdleAnimationLoop()\n }\n }\n\n this.idleAnimationLoopId = requestAnimationFrame(renderFrame)\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Idle animation loop started')\n }\n\n /**\n * 开始实时对话动画循环\n */\n private startRealtimeAnimationLoop(): void {\n if (this.realtimeAnimationLoopId) {\n return // 已经在运行\n }\n\n let lastTime = 0\n const targetFPS = 25 // 动画目标帧率(通常为25fps)\n const frameInterval = 1000 / targetFPS // 每帧间隔(毫秒)\n\n const renderFrame = async (currentTime: number) => {\n try {\n if (!this.renderSystem || !this.isRealtimePlaying) {\n this.realtimeAnimationLoopId = null\n return\n }\n\n // 控制动画帧率\n if (currentTime - lastTime < frameInterval) {\n this.realtimeAnimationLoopId = requestAnimationFrame(renderFrame)\n return\n }\n lastTime = currentTime\n\n // Transition phase first (wall-clock driven)\n if (this.isTransitioning && this.transitionKeyframes.length > 0) {\n const elapsed = performance.now() - this.transitionStartTime\n const progress = Math.min(1, Math.max(0, elapsed / this.transitionDurationMs))\n const steps = this.transitionKeyframes.length\n const idx = Math.min(steps - 1, Math.floor(progress * (steps - 1)))\n const currentFrame = this.transitionKeyframes[idx]\n const wasmParams = convertProtoFlameToWasmParams(currentFrame)\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore) {\n const sd = await avatarCore.computeFrameFlatFromParams(wasmParams)\n if (sd) {\n this.renderSystem.loadSplatsFromPackedData(sd)\n this.renderSystem.renderFrame()\n }\n }\n if (progress >= 1) {\n // 过渡完成\n this.isTransitioning = false\n this.transitionKeyframes = []\n\n // 通知播放层:过渡完成,可以启动音频播放\n this.avatarController.onTransitionComplete()\n\n if (this.endToIdleAfterTransition) {\n // 结束回到 Idle:直接停止实时循环,让 Idle 循环接管\n this.endToIdleAfterTransition = false\n this.isRealtimePlaying = false\n this.currentKeyframes = []\n this.stopRealtimeAnimationLoop()\n\n // 直接启动 Idle 循环,不要桥接帧(对齐 useRealtimeAvatar.ts)\n this.startIdleAnimationLoop()\n return\n }\n }\n this.realtimeAnimationLoopId = requestAnimationFrame(renderFrame)\n return\n }\n\n // 实时动画:由播放层通过 renderCallback 驱动\n // 这里不需要主动渲染,等待播放层的回调\n this.realtimeAnimationLoopId = requestAnimationFrame(renderFrame)\n }\n catch (error) {\n logger.error('[AvatarView] Realtime animation loop error:', error instanceof Error ? error.message : String(error))\n this.stopRealtimeAnimationLoop()\n }\n }\n\n this.realtimeAnimationLoopId = requestAnimationFrame(renderFrame)\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Realtime animation loop started')\n }\n\n /**\n * 停止idle动画循环\n */\n private stopIdleAnimationLoop(): void {\n if (this.idleAnimationLoopId) {\n cancelAnimationFrame(this.idleAnimationLoopId)\n this.idleAnimationLoopId = null\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Idle animation loop stopped')\n }\n }\n\n /**\n * 停止实时对话动画循环\n */\n private stopRealtimeAnimationLoop(): void {\n if (this.realtimeAnimationLoopId) {\n cancelAnimationFrame(this.realtimeAnimationLoopId)\n this.realtimeAnimationLoopId = null\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Realtime animation loop stopped')\n }\n }\n\n /**\n * 停止所有动画循环\n */\n private stopAllAnimationLoops(): void {\n this.stopIdleAnimationLoop()\n this.stopRealtimeAnimationLoop()\n }\n\n /**\n * 渲染实时帧(由播放层回调调用)\n */\n private renderRealtimeFrame(splatData: Float32Array, frameIndex: number): void {\n if (!this.renderSystem || !this.isRealtimePlaying || this.isTransitioning) {\n return\n }\n\n // 只在非过渡状态下渲染实时帧\n this.renderSystem.loadSplatsFromPackedData(splatData)\n this.renderSystem.renderFrame()\n this.lastRenderedFrameIndex = frameIndex\n\n // 缓存当前帧,用于 Speaking -> Idle 过渡\n if (frameIndex >= 0 && frameIndex < this.currentKeyframes.length) {\n this.lastRealtimeProtoFrame = this.currentKeyframes[frameIndex]\n }\n }\n\n /**\n * 过渡完成回调(通知播放层启动音频)\n */\n private onTransitionComplete(): void {\n // 这个方法会被播放层调用,但这里不需要做任何事情\n // 因为过渡动画的渲染已经在 startRealtimeAnimationLoop 中处理\n // 音频启动由播放层的 onTransitionComplete 处理\n }\n\n /**\n * 处理打断\n */\n private handleInterrupt(): void {\n this.isTransitioning = false\n this.transitionKeyframes = []\n this.isRealtimePlaying = false\n this.currentKeyframes = []\n this.stopRealtimeAnimationLoop()\n this.startIdleAnimationLoop()\n }\n\n /**\n * 设置 AvatarController 事件监听器\n */\n private setupControllerEventListeners(): void {\n this.avatarController.setupInternalEventListeners({\n onKeyframesUpdate: (keyframes: Flame[]) => {\n // 关键帧更新时,准备开始实时渲染\n this.prepareRealtimeRendering(keyframes)\n },\n onStartRendering: () => {\n // 播放层通知开始渲染,启动实时渲染循环\n this.startRealtimeRendering()\n },\n onStopRendering: () => {\n // 播放层通知停止渲染,生成 Speaking -> Idle 过渡\n this.stopRealtimeRendering()\n },\n onInterrupt: () => {\n // 播放层通知打断,立即停止\n this.handleInterrupt()\n },\n })\n }\n\n /**\n * 准备实时渲染(生成 Idle -> Speaking 过渡)\n */\n private async prepareRealtimeRendering(keyframes: Flame[]): Promise<void> {\n // 确保 Idle 循环停止\n this.stopIdleAnimationLoop()\n this.isRealtimePlaying = true\n this.currentKeyframes = keyframes\n this.lastRenderedFrameIndex = -1\n\n // 生成 Idle -> Speaking 过渡\n try {\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore && keyframes.length > 0) {\n // 读取 Idle 的当前帧作为起点\n const idleParams = await avatarCore.getCurrentFrameParams(this.idleCurrentFrameIndex)\n const idleFrameProto = convertWasmParamsToProtoFlame(idleParams)\n\n // 缓存 Idle 首帧,用于后续 Speaking -> Idle 过渡\n await this.getCachedIdleFirstFrame()\n\n const firstSpeaking = keyframes[0]\n this.transitionKeyframes = this.generateAndAlignTransitionFrames(idleFrameProto, firstSpeaking)\n this.isTransitioning = this.transitionKeyframes.length > 0\n this.transitionStartTime = this.isTransitioning ? performance.now() : 0\n\n if (this.isTransitioning) {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Transition started:', this.transitionKeyframes.length, 'frames')\n }\n }\n } catch (e) {\n logger.warn('[AvatarView] Transition generation failed:', e instanceof Error ? e.message : String(e))\n }\n\n // 启动实时渲染循环\n this.startRealtimeAnimationLoop()\n }\n\n /**\n * 开始实时渲染循环\n */\n private startRealtimeRendering(): void {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Starting realtime rendering with', this.currentKeyframes.length, 'keyframes')\n \n // 埋点:渲染开始\n AvatarKit.logEvent('character_view', 'info', {\n characterId: this.avatar.id,\n event: 'rendering_started',\n keyframesCount: this.currentKeyframes.length,\n })\n }\n\n /**\n * 停止实时对话渲染\n */\n private stopRealtimeRendering(): void {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Stopping realtime rendering')\n // 生成 Speaking -> Idle 过渡,过渡结束后再切回 Idle\n ;(async () => {\n try {\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore && this.currentKeyframes.length > 0) {\n const lastSpeaking = this.lastRealtimeProtoFrame || this.currentKeyframes[Math.max(0, this.lastRenderedFrameIndex)]\n // 目标固定:Idle 第 0 帧(使用缓存的 idle 首帧)\n const idleFirstProto = await this.getCachedIdleFirstFrame()\n if (idleFirstProto) {\n this.transitionKeyframes = this.generateAndAlignTransitionFrames(lastSpeaking, idleFirstProto)\n }\n this.isTransitioning = this.transitionKeyframes.length > 0\n this.transitionStartTime = this.isTransitioning ? performance.now() : 0\n this.endToIdleAfterTransition = this.isTransitioning\n if (this.isTransitioning) {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Return transition started:', this.transitionKeyframes.length, 'frames')\n // 确保实时循环在跑,用于渲染这段回退过渡\n if (!this.realtimeAnimationLoopId)\n this.startRealtimeAnimationLoop()\n return\n }\n }\n }\n catch (e) {\n logger.warn('[AvatarView] Return transition generation failed:', e instanceof Error ? e.message : String(e))\n }\n // 无法过渡时,立即切回 Idle(兜底)\n this.isRealtimePlaying = false\n this.currentKeyframes = []\n this.lastRenderedFrameIndex = -1\n this.stopRealtimeAnimationLoop()\n this.startIdleAnimationLoop()\n })()\n }\n\n /**\n * 清理视图资源\n * 关闭 avatarController 并清理所有相关资源\n */\n dispose(): void {\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Disposing avatar view...')\n\n // 埋点:视图销毁\n AvatarKit.logEvent('character_view', 'info', {\n characterId: this.avatar.id,\n event: 'disposed',\n })\n\n // 关闭 avatarController(由其管理生命周期)\n if (this.avatarController) {\n this.avatarController.clear()\n }\n\n // 停止所有动画循环\n this.stopAllAnimationLoops()\n\n // 🚨 修复:释放 AvatarCore 的角色和动画资源(但保留 core,因为它是全局共享的)\n const avatarCore = AvatarKit.getAvatarCore()\n if (avatarCore) {\n try {\n avatarCore.releaseCurrentCharacter()\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] AvatarCore character resources released')\n }\n catch (error) {\n logger.error('[AvatarView] Failed to release AvatarCore resources:', error instanceof Error ? error.message : String(error))\n }\n }\n\n // 清理渲染系统\n if (this.renderSystem) {\n this.renderSystem.dispose()\n this.renderSystem = null\n }\n\n // 清理canvas\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas)\n }\n\n // 取消尺寸监听\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n window.removeEventListener('resize', this.onWindowResize)\n\n this.isInitialized = false\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Avatar view disposed successfully')\n }\n\n /**\n * 获取相机配置\n */\n getCameraConfig(): CameraConfig | null {\n return this.cameraConfig\n }\n\n /**\n * 更新相机配置\n */\n updateCameraConfig(cameraConfig: CameraConfig): void {\n this.cameraConfig = cameraConfig\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Camera config updated:', cameraConfig)\n\n // 将新的相机配置应用到渲染系统\n if (this.renderSystem) {\n this.renderSystem.updateCamera(cameraConfig)\n if (APP_CONFIG.debug)\n logger.log('[AvatarView] Applied new camera config to render system')\n }\n }\n\n /**\n * 处理尺寸变化:通知渲染系统更新视口与投影\n */\n private handleResize(): void {\n if (this.renderSystem) {\n this.renderSystem.handleResize()\n }\n }\n\n /**\n * 获取渲染性能统计\n * @returns 渲染性能统计数据,如果渲染系统未初始化则返回 null\n */\n getPerformanceStats(): RenderPerformanceStats | null {\n if (!this.renderSystem || !this.isInitialized) {\n return null\n }\n\n return {\n renderTime: this.renderSystem.renderTime,\n sortTime: this.renderSystem.sortTime,\n backend: this.renderSystem.getBackend(),\n // pointCount 可后续通过 AvatarCoreAdapter 添加公开方法获取\n }\n }\n\n}\n"],"names":["ResourceType","extractResourceUrls","meta","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","hasMonologue","hasMonologueFromModelInfo","modelInfo","parsed","Environment","LoadProgress","ConnectionState","AvatarState","SPAvatarError","message","code","AvatarPlaybackMode","ENV_TEST","hasDebugParam","isDebugMode","APP_CONFIG","Avatar","id","characterMeta","resources","__publicField","convertProtoFlameToWasmParams","protoFlame","convertWasmParamsToProtoFlame","wasmParams","root","factory","module","this","_isNumber","n","_capitalize","str","_getter","p","booleanProps","numericProps","stringProps","arrayProps","objectProps","props","StackFrame","obj","i","v","fileName","lineNumber","columnNumber","functionName","argsStartIndex","argsEndIndex","args","locationString","parts","j","k","require$$0","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","error","urlLike","regExp","filtered","line","sanitizedLine","location","locationParts","functionNameRegex","matches","e","lineRE","lines","result","len","match","tokens","functionCall","argsRaw","_lazyMatch","__lib__","m","V","G","T","q","r","H","a","t","J","w","re","A","d","Q","W","K","X","b","h","Y","rr","er","ar","nr","o","u","s","c","g","C","_","M","tr","f","x","l","Z","D","U","ee","E","P","ir","O","S","or","R","z","ur","sr","cr","y","pr","vr","hr","L","dr","xr","mr","_r","Sr","N","$r","wr","Ar","br","Cr","Mr","Er","B","Or","Rr","zr","jr","Nr","I","kr","Br","Ir","Fr","Lr","Zr","F","Dr","Ur","Vr","Gr","Tr","qr","Hr","Jr","Qr","Wr","Kr","Xr","$","_match","zeptomatch","path","pattern","_DRIVE_LETTER_START_RE","normalizeWindowsPath","input","_UNC_REGEX","_IS_ABSOLUTE_RE","_DRIVE_LETTER_RE","_ROOT_FOLDER_RE","_EXTNAME_RE","_PATH_ROOT_RE","sep","normalize","isUNCPath","isPathAbsolute","isAbsolute","trailingSeparator","normalizeString","join","segments","seg","pathTrailing","segLeading","cwd","resolve","arguments_","argument","resolvedPath","resolvedAbsolute","index","allowAboveRoot","res","lastSegmentLength","lastSlash","dots","char","lastSlashIndex","toNamespacedPath","extname","relative","from","to","_from","_to","_fromCopy","segment","dirname","format","ext","basename","extension","lastSegment","val","parse","base","matchesGlob","_path","delimiter","_platforms","mix","del","prop","posix","win32","LogLevel","LogLevel2","LogLevelString","LogLevelString2","Format","Format2","isColorSupported","formatter","open","close","replace","string","replaceClose","start","end","nextIndex","createColors","enabled","pc","logLevelStringToLogLevelMap","logLevelToLogLevelStringMap","availableLogLevelStrings","logLevelToColorMap","availableLogLevels","availableFormats","parseErrorStacks","errorLike","item","isErrorLike","err","newLog","logLevel","context","fields","timeFormatter","fieldsObj","now","newErrorLog","errorStack","log","prettyFormatValue","value","valueString","toPrettyString","messagePartials","contextString","fieldsEntries","key","shouldOutputDebugLevelLogWhenLogLevelIsOneOf","shouldOutputVerboseLevelLogWhenLogLevelIsOneOf","shouldOutputLogLevelLogWhenLogLevelIsOneOf","shouldOutputWarningLevelLogWhenLogLevelIsOneOf","shouldOutputErrorLevelLogWhenLogLevelIsOneOf","isBrowser","shouldUseHyperlink","getGlobalFormat","withHyperlink","basePath","GLOBAL_CONFIG","inputDate","getGlobalLogLevel","getGlobalTimeFormatter","createLogg","logObj","logger","context2","logLevelString","stacks","fn","getEffectiveLogLevel","getEffectiveFormat","getEffectiveTimeFormatter","mergeOptionalParams","optionalParams","outputToConsole","raw","consoleMethod","mergedFields","fieldsToOutput","output","logLevelCheckMap","consoleMethodMap","logWithLevel","levelString","shouldOutput","stack","createLogger","currentStack","ErrorStackParser","useLogger","logBuffer","MAX_BUFFER_SIZE","flushLogs","logsToSend","uploadLogsToCLS","logs","cleanupCLS","configCache","fetchSdkConfig","version","configUrl","response","data","config","clearSdkConfigCache","AvatarCoreMemoryManager","wasmModule","arrayBuffer","size","ptr","uint8Array","configPtr","flameModel","flameTemplate","teethPb","teethNpz","offset","shapeBuffer","plyBuffer","dataPtr","shape","ply","paramsPtr","byteOffset","shape_params","expr_params","rotation","translation","neck_pose","jaw_pose","eyes_pose","eyelid","has_eyelid","params","arrayPtr","pointsPtr","pointCount","totalFloats","floatOffset","flatData","outputPtr","verticesPtr","vertexCount","facesPtr","faceCount","computeTime","landmarksPtr","landmarkCount","vertices","faces","landmarks","name","AvatarCoreAdapter","options","AvatarCoreModule","errorMessage","requiredFunctions","funcName","testPtr","testValue","frameIndex","templateResources","coreHandle","formattedResources","pointCloudBuffer","startTime","characterHandle","animData","animPtr","animStruct","handle","animationFile","animationPath","fullUrl","newHandle","frameCountPtr","errorMsg","frameCount","vertexCountPtr","faceCountPtr","jointCountPtr","jointCount","pointCountPtr","hasAnimationPtr","hasAnimation","errorCode","errorName","callback","progress","_modelData","_original3DGSPoints","_binding","_flameFaces","flameParams","AvatarKit","appId","configuration","text","prefix","token","userId","defaultConfig","event","level","contents","logMethod","_AnimationPlayer","silentAudio","audioUrl","onEnded","reject","streamingPlayer","StreamingAudioPlayer","currentTime","audio","isLast","AnimationPlayer","varint64read","lowBits","highBits","shift","middleByte","varint64write","lo","hi","bytes","hasNext","byte","splitBits","hasMoreBits","TWO_PWR_32_DBL","int64FromString","dec","minus","add1e6digit","begin","digit1e6","negate","newBits","int64ToString","bits","negative","uInt64ToString","toUnsigned","low","mid","high","digitA","digitB","digitC","decimalFrom1e7WithLeadingZeros","digit1e7","partial","varint32write","varint32read","readBytes","protoInt64","makeInt64Support","dv","MIN","MAX","UMIN","UMAX","bi","assertInt64String","assertUInt64String","symbol","getTextEncoding","te","td","WireType","FLOAT32_MAX","FLOAT32_MIN","UINT32_MAX","INT32_MAX","INT32_MIN","BinaryWriter","encodeUtf8","chunk","prev","fieldNo","type","assertUInt32","assertInt32","assertFloat32","view","tc","sign","BinaryReader","buf","decodeUtf8","tag","wireType","wt","zze","arg","MessageType","messageTypeFromJSON","object","messageTypeToJSON","createBaseClientAudioInputData","ClientAudioInputData","writer","length","reader","isSet","bytesFromBase64","base64FromBytes","createBaseFlame","Flame","end2","createBaseFlameAnimation","FlameAnimation","createBaseServerResponseAnimationData","ServerResponseAnimationData","createBaseErrorInfo","ErrorInfo","createBaseMessage","Message","b64","bin","arr","random","customRandom","alphabet","defaultSize","getRandom","mask","step","customAlphabet","nanoid","generateReqId","year","month","day","hours","minutes","seconds","timestamp","nanoId","EventEmitter","handler","handlers","AnimationWebSocketClient","characterId","url","reqId","audioData","MessageCodec","delay","NetworkLayer","dataController","metrics","shouldReportMetrics","currentDuration","animation","keyframes","AvatarController","avatar","connected","initialAudioChunks","initialKeyframes","callbacks","fps","playLoop","audioTime","currentFrame","avatarCore","splatData","listeners","errorToMessage","downloadResource","msg","_resourceCache","downloadResourceCached","cached","AvatarDownloader","baseAssetsPath","flameResources","progressCallback","templateFiles","totalFiles","loadedFiles","updateProgress","filename","loaded","promises","resourceName","buffer","cdnBaseUrl","cameraUrl","cameraSettings","loadMonologue","shapeUrl","pointCloudUrl","idleAnimationUrl","monoAnimationUrl","monoAudioUrl","reason","filesToLoad","characterData","downloadPromises","optional","preloadCameraSettings","info","dataMessage","_AvatarManager","onProgress","externalProgress","AvatarManager","depthBuffer","depthInt","indices0","indices1","counts","BUCKET_SIZE","MASK","sortSplats","packedData","cameraPosition","cameraForward","splatCount","depths","depthsInt","idx0","idx1","out","cnt","cx","cy","cz","fx","fy","fz","radixPass","keys","indicesIn","indicesOut","count","sum","idx","FLOATS_PER_POINT","reorderedBuffer","reorderPackedData","sortOrder","requiredLength","srcOffset","dstOffset","fragmentShaderSource","vertexShaderSource","WebGLRenderer","canvas","backgroundColor","gl","program","quadVertices","_sortOrder","floatsPerSplat","bytesPerFloat","strideBytes","viewMatrix","projectionMatrix","screenSize","vertexShader","fragmentShader","lose","renderShaderCode","WebGPURenderer","adapter","uniformBufferSize","shaderModule","uniformBindGroupLayout","storageBindGroupLayout","pipelineLayout","vertexBufferLayouts","indexBufferSize","sortOrderChanged","textureView","commandEncoder","renderPass","uniformData","float32View","uint32View","RenderSystem","cameraConfig","preferBackend","startRender","startSort","reorderedData","position","target","up","forward","fov","aspect","near","far","fovYRadians","zs","fLen","right","rLen","newUp","px","py","pz","lerpArrays","linearLerp","easedProgress","fromEyelid","toEyelid","generateTransitionFrames","durationMs","steps","frames","AvatarView","mode","ensureLen","fromFixed","toFixed","exprLen","frame","aligned","idle0Params","container","containerWidth","containerHeight","canvasSize","dpr","cameraInfo","defaultCamera","characterCameraSettings","candidateSettings","source","fallback","safeValue","fallbackValue","translationX","translationY","translationZ","yaw","fovRadians","hasCustomTranslation","hasCustomFov","hasCustomRotation","sinYaw","cosYaw","forwardLength","normalizedForward","derivedCamera","neutralParams","lastTime","frameInterval","renderFrame","elapsed","sd","idleParams","idleFrameProto","firstSpeaking","lastSpeaking","idleFirstProto"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,18,19,20,21,23]}
|