@spatius/avatarkit 1.3.1-beta.5 → 1.3.1-beta.7
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 +10 -0
- package/dist/{AvatarDownloader-DqxFbPSb.js → AvatarDownloader-B1tJTnIb.js} +4 -4
- package/dist/{AvatarSDK-BRDgRJ_Z.js → AvatarSDK-CTprrfJk.js} +3 -3
- package/dist/{OpusCodec-Bo1tty8H.js → OpusCodec-PWv7ynPp.js} +1 -1
- package/dist/{OpusDecoderProxy-9hC5C8o1.js → OpusDecoderProxy-m0fVN_M2.js} +3 -3
- package/dist/{OpusEncoderProxy-DyX-nL6Q.js → OpusEncoderProxy-DiW21sBK.js} +3 -3
- package/dist/{StreamingAudioPlayer-BRmZO9aV.js → StreamingAudioPlayer-C6hgkvbK.js} +2 -2
- package/dist/assets/{AvatarDownloader-C85m5uos.js → AvatarDownloader-LO9uuYvm.js} +2 -2
- package/dist/assets/{AvatarSDK-dtQsJHmr.js → AvatarSDK-CPEeTeLT.js} +3 -3
- package/dist/assets/{OpusDecoderWorker.worker-DkBuCaO8.js → OpusDecoderWorker.worker-CSSWn75M.js} +1 -1
- package/dist/assets/{OpusEncoderWorker.worker-ZqEypyPc.js → OpusEncoderWorker.worker-q4TdCVDZ.js} +1 -1
- package/dist/assets/{logger-Dxe0Iw4R.js → logger-DCzHWd4N.js} +147 -15
- package/dist/{error-utils-Ct04L0Ek.js → error-utils-BCZDCrc6.js} +1 -1
- package/dist/index.js +15 -13
- package/dist/internal-telemetry.js +1 -1
- package/dist/{logger-C61wOfFi.js → logger-DdmfSEn-.js} +147 -15
- package/dist/{pwa-cache-manager-0wrNgZ7C.js → pwa-cache-manager-BMKyJWXI.js} +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.3.1-beta.7] - 2026-08-02
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Internal telemetry changes only; no changes to the public API or runtime behavior.
|
|
12
|
+
|
|
13
|
+
## [1.3.1-beta.6] - 2026-08-01
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Internal telemetry changes only; no changes to the public API or runtime behavior.
|
|
17
|
+
|
|
8
18
|
## [1.3.1-beta.5] - 2026-07-31
|
|
9
19
|
|
|
10
20
|
### Changed
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { t as AvatarSDK } from "./AvatarSDK-
|
|
3
|
-
import { Et as ErrorCode, c as logEvent, gt as generateTraceId, l as logMetric, t as logger, vt as AvatarError, y as recordHttpClientDuration } from "./logger-
|
|
4
|
-
import { n as APP_CONFIG, r as getFlameCdnBase, t as errorToMessage } from "./error-utils-
|
|
5
|
-
import { t as PwaCacheManager } from "./pwa-cache-manager-
|
|
2
|
+
import { t as AvatarSDK } from "./AvatarSDK-CTprrfJk.js";
|
|
3
|
+
import { Et as ErrorCode, c as logEvent, gt as generateTraceId, l as logMetric, t as logger, vt as AvatarError, y as recordHttpClientDuration } from "./logger-DdmfSEn-.js";
|
|
4
|
+
import { n as APP_CONFIG, r as getFlameCdnBase, t as errorToMessage } from "./error-utils-BCZDCrc6.js";
|
|
5
|
+
import { t as PwaCacheManager } from "./pwa-cache-manager-BMKyJWXI.js";
|
|
6
6
|
//#region core/AvatarDownloader.ts
|
|
7
7
|
var AvatarDownloader_exports = /* @__PURE__ */ __exportAll({ AvatarDownloader: () => AvatarDownloader });
|
|
8
8
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { $ as TraceFlags, A as ExportResultCode, B as ATTR_EXCEPTION_TYPE, C as createInstrumentationScope, D as defaultResource, E as OTLPExporterBase, F as isTimeInputHrTime, G as isTracingSuppressed, H as getNumberFromEnv, I as millisToHrTime, J as diag$1, K as suppressTracing, L as otperformance, M as hrTime, N as hrTimeDuration, O as resourceFromAttributes, P as isTimeInput, Q as INVALID_SPAN_CONTEXT, R as ATTR_EXCEPTION_MESSAGE, S as JSON_ENCODER, T as toAttributes, Tt as DrivingServiceMode, U as getStringFromEnv, V as ATTR_SERVICE_NAME, W as globalErrorHandler, X as isSpanContextValid, Y as context, Z as isValidTraceId, _ as cleanupOtelMetrics, a as clientContextFields, at as getGlobal, c as logEvent, ct as OTEL_LOGS_ENDPOINT, d as cleanupOtel, dt as OTEL_TRACES_ENDPOINT, et as ContextAPI, f as initializeOtel, ft as OTEL_TRACES_STREAM_NAME, g as fetchBootstrap, h as clockSync, ht as idManager, i as cleanupPostHog, it as DiagAPI, j as addHrTimes, k as BindOnceFuture, kt as LogLevel, lt as OTEL_PASSWORD, n as setLogLevel, nt as ROOT_CONTEXT, o as getLogsFeatureFlag, ot as registerGlobal, pt as OTEL_USERNAME, q as trace, r as logSink, rt as createContextKey, s as initializePostHog, st as unregisterGlobal, t as logger, tt as createNoopMeter, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_STREAM_NAME, v as initializeOtelMetrics, w as createResource, x as createLegacyOtlpBrowserExportDelegate, z as ATTR_EXCEPTION_STACKTRACE } from "./logger-
|
|
2
|
+
import { $ as TraceFlags, A as ExportResultCode, B as ATTR_EXCEPTION_TYPE, C as createInstrumentationScope, D as defaultResource, E as OTLPExporterBase, F as isTimeInputHrTime, G as isTracingSuppressed, H as getNumberFromEnv, I as millisToHrTime, J as diag$1, K as suppressTracing, L as otperformance, M as hrTime, N as hrTimeDuration, O as resourceFromAttributes, P as isTimeInput, Q as INVALID_SPAN_CONTEXT, R as ATTR_EXCEPTION_MESSAGE, S as JSON_ENCODER, T as toAttributes, Tt as DrivingServiceMode, U as getStringFromEnv, V as ATTR_SERVICE_NAME, W as globalErrorHandler, X as isSpanContextValid, Y as context, Z as isValidTraceId, _ as cleanupOtelMetrics, a as clientContextFields, at as getGlobal, c as logEvent, ct as OTEL_LOGS_ENDPOINT, d as cleanupOtel, dt as OTEL_TRACES_ENDPOINT, et as ContextAPI, f as initializeOtel, ft as OTEL_TRACES_STREAM_NAME, g as fetchBootstrap, h as clockSync, ht as idManager, i as cleanupPostHog, it as DiagAPI, j as addHrTimes, k as BindOnceFuture, kt as LogLevel, lt as OTEL_PASSWORD, n as setLogLevel, nt as ROOT_CONTEXT, o as getLogsFeatureFlag, ot as registerGlobal, pt as OTEL_USERNAME, q as trace, r as logSink, rt as createContextKey, s as initializePostHog, st as unregisterGlobal, t as logger, tt as createNoopMeter, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_STREAM_NAME, v as initializeOtelMetrics, w as createResource, x as createLegacyOtlpBrowserExportDelegate, z as ATTR_EXCEPTION_STACKTRACE } from "./logger-DdmfSEn-.js";
|
|
3
3
|
//#region node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js
|
|
4
4
|
/**
|
|
5
5
|
* Read a 64 bit varint as two JS numbers.
|
|
@@ -6321,7 +6321,7 @@ var AvatarSDK = class {
|
|
|
6321
6321
|
static _initializationState = "uninitialized";
|
|
6322
6322
|
static _initializingPromise = null;
|
|
6323
6323
|
static _configuration = null;
|
|
6324
|
-
static _version = "1.3.1-beta.
|
|
6324
|
+
static _version = "1.3.1-beta.7";
|
|
6325
6325
|
static _avatarCore = null;
|
|
6326
6326
|
static _cachedDeviceScore = null;
|
|
6327
6327
|
static _rendererBackend = null;
|
|
@@ -6487,7 +6487,7 @@ var AvatarSDK = class {
|
|
|
6487
6487
|
logger.log("[AvatarSDK] Loading template resources...");
|
|
6488
6488
|
logEvent("template_init_start", "info", { stage: "sdk_init" });
|
|
6489
6489
|
try {
|
|
6490
|
-
const { AvatarDownloader } = await import("./AvatarDownloader-
|
|
6490
|
+
const { AvatarDownloader } = await import("./AvatarDownloader-B1tJTnIb.js").then((n) => n.n);
|
|
6491
6491
|
const templateResources = await new AvatarDownloader().loadUnifiedTemplate();
|
|
6492
6492
|
if (await this._avatarCore.loadTemplateResourcesFromBuffers(templateResources)) logger.log("[AvatarSDK] Template resources initialized successfully");
|
|
6493
6493
|
else logger.log("[AvatarSDK] Template resources already initialized, skipping...");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as __exportAll, r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { t as logger } from "./logger-
|
|
2
|
+
import { t as logger } from "./logger-DdmfSEn-.js";
|
|
3
3
|
/** Opus granule positions are always in 48 kHz samples, regardless of input rate. */
|
|
4
4
|
var OPUS_GRANULE_RATE = 48e3;
|
|
5
5
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as logger } from "./logger-
|
|
1
|
+
import { t as logger } from "./logger-DdmfSEn-.js";
|
|
2
2
|
//#region audio/OpusDecoderProxy.ts
|
|
3
3
|
var OpusDecoderProxy = class OpusDecoderProxy {
|
|
4
4
|
worker = null;
|
|
@@ -21,7 +21,7 @@ var OpusDecoderProxy = class OpusDecoderProxy {
|
|
|
21
21
|
} catch (err) {
|
|
22
22
|
logger.warn("[Opus][DecoderProxy] Worker unavailable, falling back to main-thread decode:", err instanceof Error ? err.message : String(err));
|
|
23
23
|
}
|
|
24
|
-
const { OggOpusDecoder } = await import("./OpusCodec-
|
|
24
|
+
const { OggOpusDecoder } = await import("./OpusCodec-PWv7ynPp.js").then((n) => n.n);
|
|
25
25
|
proxy.fallbackDecoder = new OggOpusDecoder();
|
|
26
26
|
proxy.backend = "main-thread";
|
|
27
27
|
return proxy;
|
|
@@ -32,7 +32,7 @@ var OpusDecoderProxy = class OpusDecoderProxy {
|
|
|
32
32
|
try {
|
|
33
33
|
worker = new Worker(new URL(
|
|
34
34
|
/* @vite-ignore */
|
|
35
|
-
"/assets/OpusDecoderWorker.worker-
|
|
35
|
+
"/assets/OpusDecoderWorker.worker-CSSWn75M.js",
|
|
36
36
|
"" + import.meta.url
|
|
37
37
|
), { type: "module" });
|
|
38
38
|
} catch (err) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as logger } from "./logger-
|
|
1
|
+
import { t as logger } from "./logger-DdmfSEn-.js";
|
|
2
2
|
//#region audio/OpusEncoderProxy.ts
|
|
3
3
|
var OpusEncoderProxy = class OpusEncoderProxy {
|
|
4
4
|
worker = null;
|
|
@@ -26,7 +26,7 @@ var OpusEncoderProxy = class OpusEncoderProxy {
|
|
|
26
26
|
} catch (err) {
|
|
27
27
|
logger.warn("[Opus][Proxy] Worker unavailable, falling back to main-thread encode:", err instanceof Error ? err.message : String(err));
|
|
28
28
|
}
|
|
29
|
-
const { OggOpusEncoder } = await import("./OpusCodec-
|
|
29
|
+
const { OggOpusEncoder } = await import("./OpusCodec-PWv7ynPp.js").then((n) => n.n);
|
|
30
30
|
proxy.fallbackEncoder = new OggOpusEncoder(sampleRate, bitrate);
|
|
31
31
|
proxy.backend = "main-thread";
|
|
32
32
|
return proxy;
|
|
@@ -37,7 +37,7 @@ var OpusEncoderProxy = class OpusEncoderProxy {
|
|
|
37
37
|
try {
|
|
38
38
|
worker = new Worker(new URL(
|
|
39
39
|
/* @vite-ignore */
|
|
40
|
-
"/assets/OpusEncoderWorker.worker-
|
|
40
|
+
"/assets/OpusEncoderWorker.worker-q4TdCVDZ.js",
|
|
41
41
|
"" + import.meta.url
|
|
42
42
|
), { type: "module" });
|
|
43
43
|
} catch (err) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as logEvent, t as logger } from "./logger-
|
|
2
|
-
import { n as APP_CONFIG, t as errorToMessage } from "./error-utils-
|
|
1
|
+
import { c as logEvent, t as logger } from "./logger-DdmfSEn-.js";
|
|
2
|
+
import { n as APP_CONFIG, t as errorToMessage } from "./error-utils-BCZDCrc6.js";
|
|
3
3
|
//#region audio/StreamingAudioPlayer.ts
|
|
4
4
|
/**
|
|
5
5
|
* Streaming Audio Player
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { _ as recordHttpClientDuration, c as logEvent, dt as isDebugMode, l as logMetric, mt as AvatarError, pt as generateTraceId, t as logger, vt as ErrorCode } from "./logger-
|
|
2
|
-
import { t as AvatarSDK } from "./AvatarSDK-
|
|
1
|
+
import { _ as recordHttpClientDuration, c as logEvent, dt as isDebugMode, l as logMetric, mt as AvatarError, pt as generateTraceId, t as logger, vt as ErrorCode } from "./logger-DCzHWd4N.js";
|
|
2
|
+
import { t as AvatarSDK } from "./AvatarSDK-CPEeTeLT.js";
|
|
3
3
|
//#region config/app-config.ts
|
|
4
4
|
const GLOBAL_FLAME_CDN_BASE = "https://cdn.spatialwalk.cloud/public";
|
|
5
5
|
const CN_FLAME_CDN_BASE = "https://cdn.spatialwalk.top/public";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { $ as ROOT_CONTEXT, A as hrTimeDuration, B as getStringFromEnv, C as OTLPExporterBase, D as ExportResultCode, E as BindOnceFuture, F as ATTR_EXCEPTION_MESSAGE, G as diag$1, H as isTracingSuppressed, I as ATTR_EXCEPTION_STACKTRACE, J as isValidTraceId, K as context, L as ATTR_EXCEPTION_TYPE, M as isTimeInputHrTime, N as millisToHrTime, O as addHrTimes, P as otperformance, Q as createNoopMeter, R as ATTR_SERVICE_NAME, S as toAttributes, T as resourceFromAttributes, U as suppressTracing, V as globalErrorHandler, W as trace, X as TraceFlags, Y as INVALID_SPAN_CONTEXT, Z as ContextAPI, _t as DrivingServiceMode, a as clientContextFields, at as OTEL_LOGS_ENDPOINT, b as createInstrumentationScope, c as logEvent, ct as OTEL_TRACES_ENDPOINT, d as cleanupOtel, et as createContextKey, f as initializeOtel, ft as idManager, g as initializeOtelMetrics, h as cleanupOtelMetrics, i as cleanupPostHog, it as unregisterGlobal, j as isTimeInput, k as hrTime, lt as OTEL_TRACES_STREAM_NAME, m as fetchBootstrap, n as setLogLevel, nt as getGlobal, o as getLogsFeatureFlag, ot as OTEL_PASSWORD, p as clockSync, q as isSpanContextValid, r as logSink, rt as registerGlobal, s as initializePostHog, st as OTEL_STREAM_NAME, t as logger, tt as DiagAPI, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_USERNAME, v as createLegacyOtlpBrowserExportDelegate, w as defaultResource, x as createResource, y as JSON_ENCODER, yt as LogLevel, z as getNumberFromEnv } from "./logger-
|
|
2
|
+
import { $ as ROOT_CONTEXT, A as hrTimeDuration, B as getStringFromEnv, C as OTLPExporterBase, D as ExportResultCode, E as BindOnceFuture, F as ATTR_EXCEPTION_MESSAGE, G as diag$1, H as isTracingSuppressed, I as ATTR_EXCEPTION_STACKTRACE, J as isValidTraceId, K as context, L as ATTR_EXCEPTION_TYPE, M as isTimeInputHrTime, N as millisToHrTime, O as addHrTimes, P as otperformance, Q as createNoopMeter, R as ATTR_SERVICE_NAME, S as toAttributes, T as resourceFromAttributes, U as suppressTracing, V as globalErrorHandler, W as trace, X as TraceFlags, Y as INVALID_SPAN_CONTEXT, Z as ContextAPI, _t as DrivingServiceMode, a as clientContextFields, at as OTEL_LOGS_ENDPOINT, b as createInstrumentationScope, c as logEvent, ct as OTEL_TRACES_ENDPOINT, d as cleanupOtel, et as createContextKey, f as initializeOtel, ft as idManager, g as initializeOtelMetrics, h as cleanupOtelMetrics, i as cleanupPostHog, it as unregisterGlobal, j as isTimeInput, k as hrTime, lt as OTEL_TRACES_STREAM_NAME, m as fetchBootstrap, n as setLogLevel, nt as getGlobal, o as getLogsFeatureFlag, ot as OTEL_PASSWORD, p as clockSync, q as isSpanContextValid, r as logSink, rt as registerGlobal, s as initializePostHog, st as OTEL_STREAM_NAME, t as logger, tt as DiagAPI, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_USERNAME, v as createLegacyOtlpBrowserExportDelegate, w as defaultResource, x as createResource, y as JSON_ENCODER, yt as LogLevel, z as getNumberFromEnv } from "./logger-DCzHWd4N.js";
|
|
3
3
|
//#region node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js
|
|
4
4
|
var BaggageImpl = class BaggageImpl {
|
|
5
5
|
constructor(entries) {
|
|
@@ -6109,7 +6109,7 @@ var AvatarSDK = class {
|
|
|
6109
6109
|
static _initializationState = "uninitialized";
|
|
6110
6110
|
static _initializingPromise = null;
|
|
6111
6111
|
static _configuration = null;
|
|
6112
|
-
static _version = "1.3.1-beta.
|
|
6112
|
+
static _version = "1.3.1-beta.7";
|
|
6113
6113
|
static _avatarCore = null;
|
|
6114
6114
|
static _cachedDeviceScore = null;
|
|
6115
6115
|
static _rendererBackend = null;
|
|
@@ -6275,7 +6275,7 @@ var AvatarSDK = class {
|
|
|
6275
6275
|
logger.log("[AvatarSDK] Loading template resources...");
|
|
6276
6276
|
logEvent("template_init_start", "info", { stage: "sdk_init" });
|
|
6277
6277
|
try {
|
|
6278
|
-
const { AvatarDownloader } = await import("./AvatarDownloader-
|
|
6278
|
+
const { AvatarDownloader } = await import("./AvatarDownloader-LO9uuYvm.js");
|
|
6279
6279
|
const templateResources = await new AvatarDownloader().loadUnifiedTemplate();
|
|
6280
6280
|
if (await this._avatarCore.loadTemplateResourcesFromBuffers(templateResources)) logger.log("[AvatarSDK] Template resources initialized successfully");
|
|
6281
6281
|
else logger.log("[AvatarSDK] Template resources already initialized, skipping...");
|
package/dist/assets/{OpusDecoderWorker.worker-DkBuCaO8.js → OpusDecoderWorker.worker-CSSWn75M.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { t as logger } from "./logger-
|
|
2
|
+
import { t as logger } from "./logger-DCzHWd4N.js";
|
|
3
3
|
//#region __vite-browser-external
|
|
4
4
|
var require___vite_browser_external = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
5
5
|
module.exports = {};
|
package/dist/assets/{OpusEncoderWorker.worker-ZqEypyPc.js → OpusEncoderWorker.worker-q4TdCVDZ.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
|
|
2
|
-
import { t as logger } from "./logger-
|
|
2
|
+
import { t as logger } from "./logger-DCzHWd4N.js";
|
|
3
3
|
//#region __vite-browser-external
|
|
4
4
|
var require___vite_browser_external = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
5
5
|
module.exports = {};
|
|
@@ -13550,7 +13550,7 @@ const HTTP_NETWORK_BUCKETS_MS = [
|
|
|
13550
13550
|
5e3
|
|
13551
13551
|
];
|
|
13552
13552
|
/**
|
|
13553
|
-
*
|
|
13553
|
+
* 播放指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
|
|
13554
13554
|
* 帧率只可能落在 0~25,缺帧数和卡顿次数几乎全部挤在第一个桶里,分位数因此毫无意义。
|
|
13555
13555
|
* 桶按各指标的实际值域给:
|
|
13556
13556
|
*
|
|
@@ -13559,9 +13559,18 @@ const HTTP_NETWORK_BUCKETS_MS = [
|
|
|
13559
13559
|
* - 卡顿次数:数的是次数不是帧,自成一组。
|
|
13560
13560
|
* - 百分比:每 5% 一档,0~100。
|
|
13561
13561
|
* - 时长:分两组——整轮播放是秒级,单次卡顿是一帧起步的毫秒级。
|
|
13562
|
+
* - 延迟:音频送入是等距(要看偏离整秒多少),动画到达是等比(两种用法差一个数量级)。
|
|
13563
|
+
* - GPU 耗时:个位数毫秒,按帧预算设档。
|
|
13562
13564
|
*
|
|
13563
|
-
*
|
|
13564
|
-
*
|
|
13565
|
+
* 本 SDK 与 @spatius/avatarkit-rtc(meter 名 spatius-avatarkit-rtc)两边的指标都在这里配:
|
|
13566
|
+
* view 只能配在创建 MeterProvider 的这一侧,rtc 那批虽由另一个包发出,桶定义也得留在此处。
|
|
13567
|
+
* 同名概念两边共用一组桶,好让两条链路的分布能直接叠着比。
|
|
13568
|
+
*/
|
|
13569
|
+
/**
|
|
13570
|
+
* 上界给到 30 而非 25:25fps 是目标帧率,正常轮次全落在那一档,若把它当上界,
|
|
13571
|
+
* 每一轮健康播放都会挤进 +Inf 溢出桶,与真正超发的异常轮次混在一起,
|
|
13572
|
+
* 这条 metric 就只剩「是否达标」这一个比特的信息。25 单独成档、上面再留几格,
|
|
13573
|
+
* 达标与超发才分得开。
|
|
13565
13574
|
*/
|
|
13566
13575
|
const RTC_FPS_BUCKETS = [
|
|
13567
13576
|
0,
|
|
@@ -13588,7 +13597,12 @@ const RTC_FPS_BUCKETS = [
|
|
|
13588
13597
|
21,
|
|
13589
13598
|
22,
|
|
13590
13599
|
23,
|
|
13591
|
-
24
|
|
13600
|
+
24,
|
|
13601
|
+
25,
|
|
13602
|
+
26,
|
|
13603
|
+
27,
|
|
13604
|
+
28,
|
|
13605
|
+
30
|
|
13592
13606
|
];
|
|
13593
13607
|
/**
|
|
13594
13608
|
* 一轮播出的帧数。档位是播放时长桶除以帧间隔(40ms),和时长视角一一对应:
|
|
@@ -13622,8 +13636,9 @@ const RTC_LOST_FRAME_BUCKETS = [
|
|
|
13622
13636
|
256
|
|
13623
13637
|
];
|
|
13624
13638
|
/**
|
|
13625
|
-
*
|
|
13626
|
-
*
|
|
13639
|
+
* 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义。
|
|
13640
|
+
* 低位逐个分档、高位翻倍:一轮几次和一轮几十次是两种情况,都要看得出来。
|
|
13641
|
+
* 实测慢网络下一轮 35 次,因此高位必须留到三位数。
|
|
13627
13642
|
*/
|
|
13628
13643
|
const RTC_STALL_COUNT_BUCKETS = [
|
|
13629
13644
|
0,
|
|
@@ -13632,10 +13647,12 @@ const RTC_STALL_COUNT_BUCKETS = [
|
|
|
13632
13647
|
3,
|
|
13633
13648
|
4,
|
|
13634
13649
|
5,
|
|
13635
|
-
|
|
13636
|
-
12,
|
|
13650
|
+
10,
|
|
13637
13651
|
20,
|
|
13638
|
-
40
|
|
13652
|
+
40,
|
|
13653
|
+
80,
|
|
13654
|
+
160,
|
|
13655
|
+
320
|
|
13639
13656
|
];
|
|
13640
13657
|
const RTC_PERCENT_BUCKETS = [
|
|
13641
13658
|
0,
|
|
@@ -13687,20 +13704,135 @@ const RTC_STALL_DURATION_BUCKETS_MS = [
|
|
|
13687
13704
|
5120,
|
|
13688
13705
|
10240
|
|
13689
13706
|
];
|
|
13707
|
+
/**
|
|
13708
|
+
* 音频送入节奏:tap_N 是第 N 秒音频送入的时刻,metric 记的是相对首包(tap_0)的累计 Δ。
|
|
13709
|
+
* 流式输入下 tap_1/2/4 天然聚在 1000/2000/4000 附近,偏离多少正是要看的——喂得比实时慢,
|
|
13710
|
+
* 后台就攒不够音频、推理迟迟不触发。等距 200ms 让这三个中心各自落在档位边界上,
|
|
13711
|
+
* 偏移一两档就能读出来;等比会把它们挤进同一格。
|
|
13712
|
+
*
|
|
13713
|
+
* 上界 6000 而非 4000:4000 是 tap_4 的理想值,拿理想值当上界,正常轮次会全部挤进
|
|
13714
|
+
* +Inf 溢出桶,与真正喂得慢的轮次混在一起。
|
|
13715
|
+
*/
|
|
13716
|
+
const AUDIO_LATENCY_BUCKETS_MS = [
|
|
13717
|
+
0,
|
|
13718
|
+
200,
|
|
13719
|
+
400,
|
|
13720
|
+
600,
|
|
13721
|
+
800,
|
|
13722
|
+
1e3,
|
|
13723
|
+
1200,
|
|
13724
|
+
1400,
|
|
13725
|
+
1600,
|
|
13726
|
+
1800,
|
|
13727
|
+
2e3,
|
|
13728
|
+
2200,
|
|
13729
|
+
2400,
|
|
13730
|
+
2600,
|
|
13731
|
+
2800,
|
|
13732
|
+
3e3,
|
|
13733
|
+
3200,
|
|
13734
|
+
3400,
|
|
13735
|
+
3600,
|
|
13736
|
+
3800,
|
|
13737
|
+
4e3,
|
|
13738
|
+
4200,
|
|
13739
|
+
4400,
|
|
13740
|
+
4600,
|
|
13741
|
+
4800,
|
|
13742
|
+
5e3,
|
|
13743
|
+
5200,
|
|
13744
|
+
5400,
|
|
13745
|
+
5600,
|
|
13746
|
+
5800,
|
|
13747
|
+
6e3
|
|
13748
|
+
];
|
|
13749
|
+
/**
|
|
13750
|
+
* 动画包到达:anim_N 是第 N 组动画包到达的时刻(同样相对 tap_0 的累计 Δ)。
|
|
13751
|
+
* 后台攒够音频(2s/4s/4s)就推理下发,所以这个值等于「攒音频的等待 + 推理 + 网络下行」,
|
|
13752
|
+
* 与播放进度无关:一次性灌入 10s 预制音频,三个包会连着回来,全落在低位;实时流式喂,
|
|
13753
|
+
* 则要等音频攒够,anim_2 可以到十几秒。两种用法差一个数量级,同一个直方图要都装得下,
|
|
13754
|
+
* 因此用等比而非等距——低位密到看清推理耗时,高位疏到兜住慢速流式。
|
|
13755
|
+
*
|
|
13756
|
+
* 200ms 起步:网络下行本身就要这个量级,再往下细分没有意义。
|
|
13757
|
+
*/
|
|
13758
|
+
const ANIM_LATENCY_BUCKETS_MS = [
|
|
13759
|
+
0,
|
|
13760
|
+
200,
|
|
13761
|
+
400,
|
|
13762
|
+
800,
|
|
13763
|
+
1600,
|
|
13764
|
+
3200,
|
|
13765
|
+
6400,
|
|
13766
|
+
12800,
|
|
13767
|
+
25600
|
|
13768
|
+
];
|
|
13769
|
+
/**
|
|
13770
|
+
* 单帧 GPU 渲染耗时。实测中低端机器可以到 30ms 上下,因此值域按机型跨度给到 100ms,
|
|
13771
|
+
* 每 5ms 一档——而不是只覆盖高端机那几毫秒。40ms 是一帧的总预算,越过就意味着 GPU
|
|
13772
|
+
* 单独一项已经吃满整帧;再往上到 100ms 是给最差的机型留的观测空间。
|
|
13773
|
+
*
|
|
13774
|
+
* webgl 没有可移植的 GPU timer,取不到样本,那几轮整条 metric 不发(见 AvatarController),
|
|
13775
|
+
* 所以这里的分布只含 webgpu 的真实数据,不会被一堆 0 压在第一格。
|
|
13776
|
+
*/
|
|
13777
|
+
const GPU_RENDER_BUCKETS_MS = [
|
|
13778
|
+
5,
|
|
13779
|
+
10,
|
|
13780
|
+
15,
|
|
13781
|
+
20,
|
|
13782
|
+
25,
|
|
13783
|
+
30,
|
|
13784
|
+
35,
|
|
13785
|
+
40,
|
|
13786
|
+
45,
|
|
13787
|
+
50,
|
|
13788
|
+
55,
|
|
13789
|
+
60,
|
|
13790
|
+
65,
|
|
13791
|
+
70,
|
|
13792
|
+
75,
|
|
13793
|
+
80,
|
|
13794
|
+
85,
|
|
13795
|
+
90,
|
|
13796
|
+
95,
|
|
13797
|
+
100
|
|
13798
|
+
];
|
|
13690
13799
|
/** metric 名 → 桶,供下面的 views 展开。 */
|
|
13691
|
-
const
|
|
13800
|
+
const BUCKET_PROFILES = [
|
|
13801
|
+
["playback_avg_fps", RTC_FPS_BUCKETS],
|
|
13802
|
+
["playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13803
|
+
["playback_audio_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13804
|
+
["playback_animation_frame_count", RTC_FRAME_COUNT_BUCKETS],
|
|
13805
|
+
["playback_jank_frame_count", RTC_LOST_FRAME_BUCKETS],
|
|
13806
|
+
["playback_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13807
|
+
["playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13808
|
+
["playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13809
|
+
["playback_audio_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13810
|
+
["playback_audio_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13811
|
+
["playback_audio_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13812
|
+
["playback_gpu_render_p50_ms", GPU_RENDER_BUCKETS_MS],
|
|
13813
|
+
["playback_gpu_render_p90_ms", GPU_RENDER_BUCKETS_MS],
|
|
13814
|
+
["playback_gpu_render_p95_ms", GPU_RENDER_BUCKETS_MS],
|
|
13815
|
+
["playback_latency_tap_1_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13816
|
+
["playback_latency_tap_2_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13817
|
+
["playback_latency_tap_4_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13818
|
+
["playback_latency_anim_0_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13819
|
+
["playback_latency_anim_1_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13820
|
+
["playback_latency_anim_2_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13692
13821
|
["rtc_playback_avg_fps", RTC_FPS_BUCKETS],
|
|
13693
13822
|
["rtc_playback_frame_count", RTC_FRAME_COUNT_BUCKETS],
|
|
13694
|
-
["rtc_playback_frames_lost", RTC_LOST_FRAME_BUCKETS],
|
|
13695
13823
|
["rtc_playback_skipped_frames", RTC_LOST_FRAME_BUCKETS],
|
|
13696
13824
|
["rtc_playback_tail_discarded", RTC_LOST_FRAME_BUCKETS],
|
|
13697
13825
|
["rtc_playback_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13698
13826
|
["rtc_playback_start_transition_missing", RTC_LOST_FRAME_BUCKETS],
|
|
13699
13827
|
["rtc_playback_end_transition_missing", RTC_LOST_FRAME_BUCKETS],
|
|
13700
|
-
["
|
|
13828
|
+
["rtc_playback_skip_rate_pct", RTC_PERCENT_BUCKETS],
|
|
13701
13829
|
["rtc_playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13702
13830
|
["rtc_playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13703
|
-
["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS]
|
|
13831
|
+
["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13832
|
+
["rtc_transport_packets_lost", RTC_LOST_FRAME_BUCKETS],
|
|
13833
|
+
["rtc_transport_packets_recovered", RTC_LOST_FRAME_BUCKETS],
|
|
13834
|
+
["rtc_transport_packets_dropped", RTC_LOST_FRAME_BUCKETS],
|
|
13835
|
+
["rtc_transport_packets_out_of_order", RTC_LOST_FRAME_BUCKETS]
|
|
13704
13836
|
];
|
|
13705
13837
|
const METRIC_EXPORT_INTERVAL_MS = 1e4;
|
|
13706
13838
|
let sdkVersion$2 = "1.0.0";
|
|
@@ -13747,7 +13879,7 @@ function initializeOtelMetrics(version, resourceAttrs) {
|
|
|
13747
13879
|
type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
|
|
13748
13880
|
options: { boundaries: HTTP_NETWORK_BUCKETS_MS }
|
|
13749
13881
|
}
|
|
13750
|
-
}, ...
|
|
13882
|
+
}, ...BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
|
|
13751
13883
|
instrumentName,
|
|
13752
13884
|
aggregation: {
|
|
13753
13885
|
type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
|
|
@@ -15109,7 +15241,7 @@ async function writeToLocalLog(message, level, extra = {}) {
|
|
|
15109
15241
|
try {
|
|
15110
15242
|
const { shouldPersist, sanitized } = sanitizeForLocalLog(message);
|
|
15111
15243
|
if (!shouldPersist) return;
|
|
15112
|
-
const { AvatarSDK } = await import("./AvatarSDK-
|
|
15244
|
+
const { AvatarSDK } = await import("./AvatarSDK-CPEeTeLT.js").then((n) => n.n);
|
|
15113
15245
|
const version = AvatarSDK.version;
|
|
15114
15246
|
const appId = idManager.getAppId();
|
|
15115
15247
|
const userId = idManager.getUserId();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mt as isDebugMode } from "./logger-
|
|
1
|
+
import { mt as isDebugMode } from "./logger-DdmfSEn-.js";
|
|
2
2
|
//#region config/app-config.ts
|
|
3
3
|
var GLOBAL_FLAME_CDN_BASE = "https://cdn.spatialwalk.cloud/public";
|
|
4
4
|
var CN_FLAME_CDN_BASE = "https://cdn.spatialwalk.top/public";
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a as avatarViewRegistry, c as Message, d as BinaryReader, f as BinaryWriter, i as buildTraceparent, l as MessageType, o as AudioFormat, r as startPlaybackTrace, s as EgressType, t as AvatarSDK, u as TransportCompression } from "./AvatarSDK-
|
|
2
|
-
import { At as RENDER_QUALITY_PARAMS, Ct as DEFAULT_REGION, Dt as FrameStarvationMode, Et as ErrorCode, Mt as TransitionType, Ot as LoadProgress, St as DEFAULT_OPUS_BITRATE, Tt as DrivingServiceMode, _t as AnimationType, b as recordMetric, bt as ConnectionState, c as logEvent, h as clockSync, ht as idManager, jt as RenderQuality, kt as LogLevel, l as logMetric, m as resolveMarks, p as monoTimestamp, t as logger, vt as AvatarError, wt as DEFAULT_REGION_REQUEST, xt as ConversationState, yt as AvatarState } from "./logger-
|
|
3
|
-
import { n as APP_CONFIG } from "./error-utils-
|
|
4
|
-
import { r as OggMuxer, t as OggPageSplitter } from "./OpusCodec-
|
|
5
|
-
import { t as AvatarDownloader } from "./AvatarDownloader-
|
|
1
|
+
import { a as avatarViewRegistry, c as Message, d as BinaryReader, f as BinaryWriter, i as buildTraceparent, l as MessageType, o as AudioFormat, r as startPlaybackTrace, s as EgressType, t as AvatarSDK, u as TransportCompression } from "./AvatarSDK-CTprrfJk.js";
|
|
2
|
+
import { At as RENDER_QUALITY_PARAMS, Ct as DEFAULT_REGION, Dt as FrameStarvationMode, Et as ErrorCode, Mt as TransitionType, Ot as LoadProgress, St as DEFAULT_OPUS_BITRATE, Tt as DrivingServiceMode, _t as AnimationType, b as recordMetric, bt as ConnectionState, c as logEvent, h as clockSync, ht as idManager, jt as RenderQuality, kt as LogLevel, l as logMetric, m as resolveMarks, p as monoTimestamp, t as logger, vt as AvatarError, wt as DEFAULT_REGION_REQUEST, xt as ConversationState, yt as AvatarState } from "./logger-DdmfSEn-.js";
|
|
3
|
+
import { n as APP_CONFIG } from "./error-utils-BCZDCrc6.js";
|
|
4
|
+
import { r as OggMuxer, t as OggPageSplitter } from "./OpusCodec-PWv7ynPp.js";
|
|
5
|
+
import { t as AvatarDownloader } from "./AvatarDownloader-B1tJTnIb.js";
|
|
6
6
|
//#region core/Avatar.ts
|
|
7
7
|
var Avatar = class {
|
|
8
8
|
id;
|
|
@@ -309,8 +309,8 @@ var AnimationPlayer = class AnimationPlayer {
|
|
|
309
309
|
*/
|
|
310
310
|
async createAndInitializeStreamingPlayer() {
|
|
311
311
|
if (this.streamingPlayer) return;
|
|
312
|
-
const { StreamingAudioPlayer } = await import("./StreamingAudioPlayer-
|
|
313
|
-
const { AvatarSDK } = await import("./AvatarSDK-
|
|
312
|
+
const { StreamingAudioPlayer } = await import("./StreamingAudioPlayer-C6hgkvbK.js");
|
|
313
|
+
const { AvatarSDK } = await import("./AvatarSDK-CTprrfJk.js").then((n) => n.n);
|
|
314
314
|
const audioFormat = AvatarSDK.getAudioFormat();
|
|
315
315
|
this.streamingPlayer = new StreamingAudioPlayer({
|
|
316
316
|
sampleRate: audioFormat.sampleRate,
|
|
@@ -1281,7 +1281,7 @@ var AnimationWebSocketClient = class extends EventEmitter {
|
|
|
1281
1281
|
return;
|
|
1282
1282
|
}
|
|
1283
1283
|
try {
|
|
1284
|
-
const { OpusEncoderProxy } = await import("./OpusEncoderProxy-
|
|
1284
|
+
const { OpusEncoderProxy } = await import("./OpusEncoderProxy-DiW21sBK.js");
|
|
1285
1285
|
const bitrate = opusBitrate ?? 48e3;
|
|
1286
1286
|
this.opusEncoder = await OpusEncoderProxy.create(sampleRate, bitrate);
|
|
1287
1287
|
this.uplinkIsOpus = true;
|
|
@@ -2442,9 +2442,11 @@ var AvatarController = class {
|
|
|
2442
2442
|
recordMetric("playback_animation_frame_count", this.receivedAnimationFrames, labels);
|
|
2443
2443
|
recordMetric("playback_avg_fps", Math.round(stats.avgFps), labels);
|
|
2444
2444
|
recordMetric("playback_jank_frame_count", stats.jankFrameCount, labels);
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2445
|
+
if (stats.gpuRenderP50Ms > 0) {
|
|
2446
|
+
recordMetric("playback_gpu_render_p50_ms", Math.round(stats.gpuRenderP50Ms), labels);
|
|
2447
|
+
recordMetric("playback_gpu_render_p90_ms", Math.round(stats.gpuRenderP90Ms), labels);
|
|
2448
|
+
recordMetric("playback_gpu_render_p95_ms", Math.round(stats.gpuRenderP95Ms), labels);
|
|
2449
|
+
}
|
|
2448
2450
|
recordMetric("playback_stall_count", stall.count, labels);
|
|
2449
2451
|
recordMetric("playback_stall_max_ms", stall.max_ms, labels);
|
|
2450
2452
|
recordMetric("playback_stall_total_ms", stall.total_ms, labels);
|
|
@@ -2628,7 +2630,7 @@ var AvatarController = class {
|
|
|
2628
2630
|
const { inputAudioFormat } = AvatarSDK.getAudioFormat();
|
|
2629
2631
|
if (inputAudioFormat !== "opus" || this.inputOpusDecoderProxy) return;
|
|
2630
2632
|
try {
|
|
2631
|
-
const { OpusDecoderProxy } = await import("./OpusDecoderProxy-
|
|
2633
|
+
const { OpusDecoderProxy } = await import("./OpusDecoderProxy-m0fVN_M2.js");
|
|
2632
2634
|
this.inputOpusDecoderProxy = await OpusDecoderProxy.create();
|
|
2633
2635
|
this.inputDecodeChain = Promise.resolve();
|
|
2634
2636
|
} catch (error) {
|
|
@@ -3841,7 +3843,7 @@ var AvatarManager = class AvatarManager {
|
|
|
3841
3843
|
} else {
|
|
3842
3844
|
logger.log(`[AvatarManager] Avatar ${id} cache invalid: updatedAt=${cachedUpdatedAt}->${newUpdatedAt}, modelType=${cachedModelType}->${requestedModelType}, reloading...`);
|
|
3843
3845
|
this.avatarCache.delete(id);
|
|
3844
|
-
const { PwaCacheManager } = await import("./pwa-cache-manager-
|
|
3846
|
+
const { PwaCacheManager } = await import("./pwa-cache-manager-BMKyJWXI.js").then((n) => n.n);
|
|
3845
3847
|
await PwaCacheManager.clearCharacterCache(id);
|
|
3846
3848
|
}
|
|
3847
3849
|
}
|
|
@@ -13625,7 +13625,7 @@ var HTTP_NETWORK_BUCKETS_MS = [
|
|
|
13625
13625
|
5e3
|
|
13626
13626
|
];
|
|
13627
13627
|
/**
|
|
13628
|
-
*
|
|
13628
|
+
* 播放指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
|
|
13629
13629
|
* 帧率只可能落在 0~25,缺帧数和卡顿次数几乎全部挤在第一个桶里,分位数因此毫无意义。
|
|
13630
13630
|
* 桶按各指标的实际值域给:
|
|
13631
13631
|
*
|
|
@@ -13634,9 +13634,18 @@ var HTTP_NETWORK_BUCKETS_MS = [
|
|
|
13634
13634
|
* - 卡顿次数:数的是次数不是帧,自成一组。
|
|
13635
13635
|
* - 百分比:每 5% 一档,0~100。
|
|
13636
13636
|
* - 时长:分两组——整轮播放是秒级,单次卡顿是一帧起步的毫秒级。
|
|
13637
|
+
* - 延迟:音频送入是等距(要看偏离整秒多少),动画到达是等比(两种用法差一个数量级)。
|
|
13638
|
+
* - GPU 耗时:个位数毫秒,按帧预算设档。
|
|
13637
13639
|
*
|
|
13638
|
-
*
|
|
13639
|
-
*
|
|
13640
|
+
* 本 SDK 与 @spatius/avatarkit-rtc(meter 名 spatius-avatarkit-rtc)两边的指标都在这里配:
|
|
13641
|
+
* view 只能配在创建 MeterProvider 的这一侧,rtc 那批虽由另一个包发出,桶定义也得留在此处。
|
|
13642
|
+
* 同名概念两边共用一组桶,好让两条链路的分布能直接叠着比。
|
|
13643
|
+
*/
|
|
13644
|
+
/**
|
|
13645
|
+
* 上界给到 30 而非 25:25fps 是目标帧率,正常轮次全落在那一档,若把它当上界,
|
|
13646
|
+
* 每一轮健康播放都会挤进 +Inf 溢出桶,与真正超发的异常轮次混在一起,
|
|
13647
|
+
* 这条 metric 就只剩「是否达标」这一个比特的信息。25 单独成档、上面再留几格,
|
|
13648
|
+
* 达标与超发才分得开。
|
|
13640
13649
|
*/
|
|
13641
13650
|
var RTC_FPS_BUCKETS = [
|
|
13642
13651
|
0,
|
|
@@ -13663,7 +13672,12 @@ var RTC_FPS_BUCKETS = [
|
|
|
13663
13672
|
21,
|
|
13664
13673
|
22,
|
|
13665
13674
|
23,
|
|
13666
|
-
24
|
|
13675
|
+
24,
|
|
13676
|
+
25,
|
|
13677
|
+
26,
|
|
13678
|
+
27,
|
|
13679
|
+
28,
|
|
13680
|
+
30
|
|
13667
13681
|
];
|
|
13668
13682
|
/**
|
|
13669
13683
|
* 一轮播出的帧数。档位是播放时长桶除以帧间隔(40ms),和时长视角一一对应:
|
|
@@ -13697,8 +13711,9 @@ var RTC_LOST_FRAME_BUCKETS = [
|
|
|
13697
13711
|
256
|
|
13698
13712
|
];
|
|
13699
13713
|
/**
|
|
13700
|
-
*
|
|
13701
|
-
*
|
|
13714
|
+
* 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义。
|
|
13715
|
+
* 低位逐个分档、高位翻倍:一轮几次和一轮几十次是两种情况,都要看得出来。
|
|
13716
|
+
* 实测慢网络下一轮 35 次,因此高位必须留到三位数。
|
|
13702
13717
|
*/
|
|
13703
13718
|
var RTC_STALL_COUNT_BUCKETS = [
|
|
13704
13719
|
0,
|
|
@@ -13707,10 +13722,12 @@ var RTC_STALL_COUNT_BUCKETS = [
|
|
|
13707
13722
|
3,
|
|
13708
13723
|
4,
|
|
13709
13724
|
5,
|
|
13710
|
-
|
|
13711
|
-
12,
|
|
13725
|
+
10,
|
|
13712
13726
|
20,
|
|
13713
|
-
40
|
|
13727
|
+
40,
|
|
13728
|
+
80,
|
|
13729
|
+
160,
|
|
13730
|
+
320
|
|
13714
13731
|
];
|
|
13715
13732
|
var RTC_PERCENT_BUCKETS = [
|
|
13716
13733
|
0,
|
|
@@ -13762,20 +13779,135 @@ var RTC_STALL_DURATION_BUCKETS_MS = [
|
|
|
13762
13779
|
5120,
|
|
13763
13780
|
10240
|
|
13764
13781
|
];
|
|
13782
|
+
/**
|
|
13783
|
+
* 音频送入节奏:tap_N 是第 N 秒音频送入的时刻,metric 记的是相对首包(tap_0)的累计 Δ。
|
|
13784
|
+
* 流式输入下 tap_1/2/4 天然聚在 1000/2000/4000 附近,偏离多少正是要看的——喂得比实时慢,
|
|
13785
|
+
* 后台就攒不够音频、推理迟迟不触发。等距 200ms 让这三个中心各自落在档位边界上,
|
|
13786
|
+
* 偏移一两档就能读出来;等比会把它们挤进同一格。
|
|
13787
|
+
*
|
|
13788
|
+
* 上界 6000 而非 4000:4000 是 tap_4 的理想值,拿理想值当上界,正常轮次会全部挤进
|
|
13789
|
+
* +Inf 溢出桶,与真正喂得慢的轮次混在一起。
|
|
13790
|
+
*/
|
|
13791
|
+
var AUDIO_LATENCY_BUCKETS_MS = [
|
|
13792
|
+
0,
|
|
13793
|
+
200,
|
|
13794
|
+
400,
|
|
13795
|
+
600,
|
|
13796
|
+
800,
|
|
13797
|
+
1e3,
|
|
13798
|
+
1200,
|
|
13799
|
+
1400,
|
|
13800
|
+
1600,
|
|
13801
|
+
1800,
|
|
13802
|
+
2e3,
|
|
13803
|
+
2200,
|
|
13804
|
+
2400,
|
|
13805
|
+
2600,
|
|
13806
|
+
2800,
|
|
13807
|
+
3e3,
|
|
13808
|
+
3200,
|
|
13809
|
+
3400,
|
|
13810
|
+
3600,
|
|
13811
|
+
3800,
|
|
13812
|
+
4e3,
|
|
13813
|
+
4200,
|
|
13814
|
+
4400,
|
|
13815
|
+
4600,
|
|
13816
|
+
4800,
|
|
13817
|
+
5e3,
|
|
13818
|
+
5200,
|
|
13819
|
+
5400,
|
|
13820
|
+
5600,
|
|
13821
|
+
5800,
|
|
13822
|
+
6e3
|
|
13823
|
+
];
|
|
13824
|
+
/**
|
|
13825
|
+
* 动画包到达:anim_N 是第 N 组动画包到达的时刻(同样相对 tap_0 的累计 Δ)。
|
|
13826
|
+
* 后台攒够音频(2s/4s/4s)就推理下发,所以这个值等于「攒音频的等待 + 推理 + 网络下行」,
|
|
13827
|
+
* 与播放进度无关:一次性灌入 10s 预制音频,三个包会连着回来,全落在低位;实时流式喂,
|
|
13828
|
+
* 则要等音频攒够,anim_2 可以到十几秒。两种用法差一个数量级,同一个直方图要都装得下,
|
|
13829
|
+
* 因此用等比而非等距——低位密到看清推理耗时,高位疏到兜住慢速流式。
|
|
13830
|
+
*
|
|
13831
|
+
* 200ms 起步:网络下行本身就要这个量级,再往下细分没有意义。
|
|
13832
|
+
*/
|
|
13833
|
+
var ANIM_LATENCY_BUCKETS_MS = [
|
|
13834
|
+
0,
|
|
13835
|
+
200,
|
|
13836
|
+
400,
|
|
13837
|
+
800,
|
|
13838
|
+
1600,
|
|
13839
|
+
3200,
|
|
13840
|
+
6400,
|
|
13841
|
+
12800,
|
|
13842
|
+
25600
|
|
13843
|
+
];
|
|
13844
|
+
/**
|
|
13845
|
+
* 单帧 GPU 渲染耗时。实测中低端机器可以到 30ms 上下,因此值域按机型跨度给到 100ms,
|
|
13846
|
+
* 每 5ms 一档——而不是只覆盖高端机那几毫秒。40ms 是一帧的总预算,越过就意味着 GPU
|
|
13847
|
+
* 单独一项已经吃满整帧;再往上到 100ms 是给最差的机型留的观测空间。
|
|
13848
|
+
*
|
|
13849
|
+
* webgl 没有可移植的 GPU timer,取不到样本,那几轮整条 metric 不发(见 AvatarController),
|
|
13850
|
+
* 所以这里的分布只含 webgpu 的真实数据,不会被一堆 0 压在第一格。
|
|
13851
|
+
*/
|
|
13852
|
+
var GPU_RENDER_BUCKETS_MS = [
|
|
13853
|
+
5,
|
|
13854
|
+
10,
|
|
13855
|
+
15,
|
|
13856
|
+
20,
|
|
13857
|
+
25,
|
|
13858
|
+
30,
|
|
13859
|
+
35,
|
|
13860
|
+
40,
|
|
13861
|
+
45,
|
|
13862
|
+
50,
|
|
13863
|
+
55,
|
|
13864
|
+
60,
|
|
13865
|
+
65,
|
|
13866
|
+
70,
|
|
13867
|
+
75,
|
|
13868
|
+
80,
|
|
13869
|
+
85,
|
|
13870
|
+
90,
|
|
13871
|
+
95,
|
|
13872
|
+
100
|
|
13873
|
+
];
|
|
13765
13874
|
/** metric 名 → 桶,供下面的 views 展开。 */
|
|
13766
|
-
var
|
|
13875
|
+
var BUCKET_PROFILES = [
|
|
13876
|
+
["playback_avg_fps", RTC_FPS_BUCKETS],
|
|
13877
|
+
["playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13878
|
+
["playback_audio_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13879
|
+
["playback_animation_frame_count", RTC_FRAME_COUNT_BUCKETS],
|
|
13880
|
+
["playback_jank_frame_count", RTC_LOST_FRAME_BUCKETS],
|
|
13881
|
+
["playback_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13882
|
+
["playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13883
|
+
["playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13884
|
+
["playback_audio_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13885
|
+
["playback_audio_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13886
|
+
["playback_audio_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13887
|
+
["playback_gpu_render_p50_ms", GPU_RENDER_BUCKETS_MS],
|
|
13888
|
+
["playback_gpu_render_p90_ms", GPU_RENDER_BUCKETS_MS],
|
|
13889
|
+
["playback_gpu_render_p95_ms", GPU_RENDER_BUCKETS_MS],
|
|
13890
|
+
["playback_latency_tap_1_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13891
|
+
["playback_latency_tap_2_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13892
|
+
["playback_latency_tap_4_ms", AUDIO_LATENCY_BUCKETS_MS],
|
|
13893
|
+
["playback_latency_anim_0_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13894
|
+
["playback_latency_anim_1_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13895
|
+
["playback_latency_anim_2_ms", ANIM_LATENCY_BUCKETS_MS],
|
|
13767
13896
|
["rtc_playback_avg_fps", RTC_FPS_BUCKETS],
|
|
13768
13897
|
["rtc_playback_frame_count", RTC_FRAME_COUNT_BUCKETS],
|
|
13769
|
-
["rtc_playback_frames_lost", RTC_LOST_FRAME_BUCKETS],
|
|
13770
13898
|
["rtc_playback_skipped_frames", RTC_LOST_FRAME_BUCKETS],
|
|
13771
13899
|
["rtc_playback_tail_discarded", RTC_LOST_FRAME_BUCKETS],
|
|
13772
13900
|
["rtc_playback_stall_count", RTC_STALL_COUNT_BUCKETS],
|
|
13773
13901
|
["rtc_playback_start_transition_missing", RTC_LOST_FRAME_BUCKETS],
|
|
13774
13902
|
["rtc_playback_end_transition_missing", RTC_LOST_FRAME_BUCKETS],
|
|
13775
|
-
["
|
|
13903
|
+
["rtc_playback_skip_rate_pct", RTC_PERCENT_BUCKETS],
|
|
13776
13904
|
["rtc_playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
|
|
13777
13905
|
["rtc_playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13778
|
-
["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS]
|
|
13906
|
+
["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
|
|
13907
|
+
["rtc_transport_packets_lost", RTC_LOST_FRAME_BUCKETS],
|
|
13908
|
+
["rtc_transport_packets_recovered", RTC_LOST_FRAME_BUCKETS],
|
|
13909
|
+
["rtc_transport_packets_dropped", RTC_LOST_FRAME_BUCKETS],
|
|
13910
|
+
["rtc_transport_packets_out_of_order", RTC_LOST_FRAME_BUCKETS]
|
|
13779
13911
|
];
|
|
13780
13912
|
var METRIC_EXPORT_INTERVAL_MS = 1e4;
|
|
13781
13913
|
var sdkVersion$2 = "1.0.0";
|
|
@@ -13823,7 +13955,7 @@ function initializeOtelMetrics(version, resourceAttrs) {
|
|
|
13823
13955
|
type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
|
|
13824
13956
|
options: { boundaries: HTTP_NETWORK_BUCKETS_MS }
|
|
13825
13957
|
}
|
|
13826
|
-
}, ...
|
|
13958
|
+
}, ...BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
|
|
13827
13959
|
instrumentName,
|
|
13828
13960
|
aggregation: {
|
|
13829
13961
|
type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
|
|
@@ -15197,7 +15329,7 @@ async function writeToLocalLog(message, level, extra = {}) {
|
|
|
15197
15329
|
try {
|
|
15198
15330
|
const { shouldPersist, sanitized } = sanitizeForLocalLog(message);
|
|
15199
15331
|
if (!shouldPersist) return;
|
|
15200
|
-
const { AvatarSDK } = await import("./AvatarSDK-
|
|
15332
|
+
const { AvatarSDK } = await import("./AvatarSDK-CTprrfJk.js").then((n) => n.n);
|
|
15201
15333
|
const version = AvatarSDK.version;
|
|
15202
15334
|
const appId = idManager.getAppId();
|
|
15203
15335
|
const userId = idManager.getUserId();
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spatius/avatarkit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.3.1-beta.
|
|
4
|
+
"version": "1.3.1-beta.7",
|
|
5
5
|
"packageManager": "pnpm@10.18.2",
|
|
6
|
-
"description": "AvatarKit
|
|
6
|
+
"description": "AvatarKit — real-time, audio-driven avatar rendering SDK for Web.",
|
|
7
|
+
"homepage": "https://spatius.ai/",
|
|
7
8
|
"author": "AvatarKit Team",
|
|
8
9
|
"license": "UNLICENSED",
|
|
9
10
|
"keywords": [
|