@ziztechnology/dial-library 0.0.1 → 0.0.3

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/dist/index.d.mts CHANGED
@@ -1,5 +1,15 @@
1
- //#region src/sensor/unified_info.d.ts
1
+ //#region src/sensor/constants.d.ts
2
2
  type UnifiedSensorUnavailableReason = 'SENSOR_MISSING' | 'NO_SAMPLE' | 'PLATFORM_UNAVAILABLE' | 'PERMISSION_DENIED' | 'NOT_CONNECTED';
3
+ type BatteryStatus = 'CHARGING' | 'DISCHARGING' | 'FULL' | 'NOT_CHARGING' | 'UNKNOWN';
4
+ type BatteryPlugged = 'AC' | 'USB' | 'WIRELESS' | 'DOCK' | 'NONE';
5
+ type BatteryHealth = 'GOOD' | 'OVERHEAT' | 'DEAD' | 'OVER_VOLTAGE' | 'UNSPECIFIED_FAILURE' | 'COLD' | 'UNKNOWN';
6
+ declare const BATTERY_HEALTH_LABELS: Record<BatteryHealth, string>;
7
+ type CarRunningStatus = 'STOPPED' | 'STEADY_DRIVING' | 'ACCELERATION' | 'RAPID_ACCELERATION' | 'BRAKING' | 'SUDDEN_BRAKING' | 'LEFT_TURN' | 'RIGHT_TURN';
8
+ declare const CAR_RUNNING_LABELS: Record<CarRunningStatus, string>;
9
+ declare const CAR_RUNNING_STATUSES: readonly ["STOPPED", "STEADY_DRIVING", "ACCELERATION", "RAPID_ACCELERATION", "BRAKING", "SUDDEN_BRAKING", "LEFT_TURN", "RIGHT_TURN"];
10
+ declare const CAR_RUNNING_STATUS_PRIORITY: Readonly<Record<CarRunningStatus, number>>;
11
+ //#endregion
12
+ //#region src/sensor/unified_info.d.ts
3
13
  interface Vector3Value {
4
14
  x: number;
5
15
  y: number;
@@ -14,9 +24,6 @@ interface BatteryCapacityValue {
14
24
  levelPercent: number | null;
15
25
  chargeCounterUah: number | null;
16
26
  }
17
- type BatteryStatus = 'CHARGING' | 'DISCHARGING' | 'FULL' | 'NOT_CHARGING' | 'UNKNOWN';
18
- type BatteryPlugged = 'AC' | 'USB' | 'WIRELESS' | 'DOCK' | 'NONE';
19
- type BatteryHealth = 'GOOD' | 'OVERHEAT' | 'DEAD' | 'OVER_VOLTAGE' | 'UNSPECIFIED_FAILURE' | 'COLD' | 'UNKNOWN';
20
27
  interface BatteryStateValue {
21
28
  present: boolean;
22
29
  charging: boolean;
@@ -45,6 +52,7 @@ type UnifiedSensorMetric<T, TSource extends string, TUnit extends string | null,
45
52
  interface UnifiedSensorInfoPayload {
46
53
  capturedAtMs: number;
47
54
  gyroscope: UnifiedSensorMetric<Vector3Value, 'TYPE_GYROSCOPE', 'rad/s', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
55
+ accelerometer: UnifiedSensorMetric<Vector3Value, 'TYPE_ACCELEROMETER', 'm/s²', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
48
56
  batteryCapacity: UnifiedSensorMetric<BatteryCapacityValue, 'BatteryManager', null, null, number>;
49
57
  wifiSsid: UnifiedSensorMetric<string, 'NetworkCapabilities.WifiInfo', null, 'PERMISSION_DENIED' | 'NOT_CONNECTED' | 'PLATFORM_UNAVAILABLE'>;
50
58
  battery: UnifiedSensorMetric<BatteryStateValue, 'ACTION_BATTERY_CHANGED', null, 'PLATFORM_UNAVAILABLE'>;
@@ -52,8 +60,257 @@ interface UnifiedSensorInfoPayload {
52
60
  gravity: UnifiedSensorMetric<Vector3Value, 'TYPE_GRAVITY', 'm/s²', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
53
61
  orientation: UnifiedSensorMetric<OrientationValue, 'TYPE_ROTATION_VECTOR' | 'ACCELEROMETER_MAGNETIC_FIELD', 'degree', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
54
62
  magneticField: UnifiedSensorMetric<Vector3Value, 'TYPE_MAGNETIC_FIELD', 'µT', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
55
- linearAcceleration: UnifiedSensorMetric<Vector3Value, 'TYPE_LINEAR_ACCELERATION', 'm/s²', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
63
+ linearAcceleration: UnifiedSensorMetric<Vector3Value, 'TYPE_LINEAR_ACCELERATION' | 'DERIVED_ACCELEROMETER_GRAVITY', 'm/s²', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
64
+ motionIntensity?: UnifiedSensorMetric<number, 'DERIVED_ACCELEROMETER_MAGNITUDE_STDDEV', 'm/s²', 'SENSOR_MISSING' | 'NO_SAMPLE', number | null>;
56
65
  }
57
66
  declare const unifiedSensorInfo: () => Promise<UnifiedSensorInfoPayload>;
58
67
  //#endregion
59
- export { AvailableSensorMetric, BatteryCapacityValue, BatteryHealth, BatteryPlugged, BatteryStateValue, BatteryStatus, OrientationValue, UnavailableSensorMetric, UnifiedSensorInfoPayload, UnifiedSensorMetric, UnifiedSensorUnavailableReason, Vector3Value, unifiedSensorInfo };
68
+ //#region src/sensor/check_status.d.ts
69
+ interface DrivingStatusTuning {
70
+ version: string;
71
+ maxSampleAgeMs: number;
72
+ rapidLongitudinalThreshold: number;
73
+ longitudinalThreshold: number;
74
+ turnYawThreshold: number;
75
+ turnLateralThreshold: number;
76
+ motionWindowMs: number;
77
+ motionMinimumSamples: number;
78
+ drivingMotionThreshold: number;
79
+ stoppedMotionThreshold: number;
80
+ stoppedGyroThreshold: number;
81
+ hysteresisRatio: number;
82
+ smoothingWindowSize: number;
83
+ confirmationSamples: Readonly<Record<CarRunningStatus, number>>;
84
+ minimumDisplayMs: Readonly<Record<CarRunningStatus, number>>;
85
+ }
86
+ type DrivingStatusTuningOverrides = Partial<Omit<DrivingStatusTuning, 'confirmationSamples' | 'minimumDisplayMs'>> & {
87
+ confirmationSamples?: Partial<Record<CarRunningStatus, number>>;
88
+ minimumDisplayMs?: Partial<Record<CarRunningStatus, number>>;
89
+ };
90
+ declare const DEFAULT_DRIVING_STATUS_TUNING: Readonly<DrivingStatusTuning>;
91
+ interface DrivingSnapshotMetrics {
92
+ capturedAtMs: number;
93
+ longitudinal: number;
94
+ lateral: number;
95
+ yaw: number;
96
+ motionIntensity: number;
97
+ gyroMagnitude: number;
98
+ }
99
+ declare const classifyDrivingSnapshot: (info: UnifiedSensorInfoPayload, tuningOverrides?: DrivingStatusTuningOverrides) => CarRunningStatus | null;
100
+ declare const checkRunningStatus: (info: UnifiedSensorInfoPayload, tuningOverrides?: DrivingStatusTuningOverrides) => CarRunningStatus | null;
101
+ declare const resolveDrivingStatusTuning: (overrides?: DrivingStatusTuningOverrides) => DrivingStatusTuning;
102
+ declare const extractDrivingSnapshotMetrics: (info: UnifiedSensorInfoPayload, tuning?: Pick<DrivingStatusTuning, "maxSampleAgeMs">) => DrivingSnapshotMetrics | null;
103
+ declare const classifyDrivingMetrics: (metrics: DrivingSnapshotMetrics, tuning?: DrivingStatusTuning) => CarRunningStatus;
104
+ //#endregion
105
+ //#region src/sensor/driving_expressions.d.ts
106
+ interface MediaLibraryRef {
107
+ mediaAssetId?: number;
108
+ }
109
+ interface EmojiDrivingExpressionMedia {
110
+ kind: 'emoji';
111
+ text: string;
112
+ }
113
+ interface ImageDrivingExpressionMedia extends MediaLibraryRef {
114
+ kind: 'image';
115
+ url: string;
116
+ mimeType?: string;
117
+ }
118
+ interface VideoDrivingExpressionMedia extends MediaLibraryRef {
119
+ kind: 'video';
120
+ url: string;
121
+ coverUrl?: string;
122
+ mimeType?: string;
123
+ }
124
+ interface LivePhotoDrivingExpressionMedia extends MediaLibraryRef {
125
+ kind: 'live_photo';
126
+ coverUrl: string;
127
+ motionUrl: string;
128
+ }
129
+ interface TgsDrivingExpressionMedia extends MediaLibraryRef {
130
+ kind: 'tgs';
131
+ url: string;
132
+ coverUrl?: string;
133
+ }
134
+ type StructuredDrivingExpressionMedia = EmojiDrivingExpressionMedia | ImageDrivingExpressionMedia | VideoDrivingExpressionMedia | LivePhotoDrivingExpressionMedia | TgsDrivingExpressionMedia;
135
+ type DrivingExpressionMedia = string | StructuredDrivingExpressionMedia;
136
+ /**
137
+ * Compatibility shape exported by the first SDK release. New persisted
138
+ * configurations should be parsed as CompleteDrivingExpressionsConfig.
139
+ */
140
+ interface DrivingExpressionsConfig {
141
+ schemaVersion: 1;
142
+ states: Partial<Record<CarRunningStatus, DrivingExpressionMedia>> & Pick<Record<CarRunningStatus, DrivingExpressionMedia>, 'STOPPED' | 'STEADY_DRIVING'>;
143
+ }
144
+ interface CompleteDrivingExpressionsConfig {
145
+ schemaVersion: 1;
146
+ states: Record<CarRunningStatus, StructuredDrivingExpressionMedia>;
147
+ }
148
+ type DrivingExpressionsConfigInput = DrivingExpressionsConfig | CompleteDrivingExpressionsConfig;
149
+ declare const OFFICIAL_DRIVING_EXPRESSION_FALLBACKS: Readonly<Record<CarRunningStatus, Readonly<EmojiDrivingExpressionMedia>>>;
150
+ declare const OFFICIAL_DRIVING_EXPRESSIONS_CONFIG: Readonly<CompleteDrivingExpressionsConfig>;
151
+ type DrivingExpressionsConfigErrorCode = 'DRIVING_EXPRESSIONS_INVALID_SCHEMA' | 'DRIVING_EXPRESSIONS_INCOMPLETE' | 'DRIVING_EXPRESSION_INVALID_MEDIA' | 'MEDIA_URL_NOT_PUBLIC_HTTPS';
152
+ declare class DrivingExpressionsConfigError extends Error {
153
+ readonly code: DrivingExpressionsConfigErrorCode;
154
+ readonly state?: CarRunningStatus;
155
+ constructor(code: DrivingExpressionsConfigErrorCode, message: string, state?: CarRunningStatus);
156
+ }
157
+ declare class DrivingExpressionResolutionError extends Error {
158
+ readonly status: CarRunningStatus;
159
+ constructor(status: CarRunningStatus);
160
+ }
161
+ interface ParseDrivingExpressionsOptions {
162
+ /** Accept the v0 bare HTTPS image URL and normalize it to kind=image. */
163
+ allowLegacyImageUrls?: boolean;
164
+ }
165
+ declare const parseDrivingExpressionsConfig: (raw: unknown, options?: ParseDrivingExpressionsOptions) => CompleteDrivingExpressionsConfig;
166
+ declare const tryParseDrivingExpressionsConfig: (raw: unknown, options?: ParseDrivingExpressionsOptions) => CompleteDrivingExpressionsConfig | null;
167
+ /**
168
+ * Reads Runtime's typed injection first, then the legacy face-config value.
169
+ * It never installs official fallbacks implicitly.
170
+ */
171
+ declare const readDrivingExpressionsConfig: (raw?: unknown, options?: ParseDrivingExpressionsOptions) => CompleteDrivingExpressionsConfig | null;
172
+ /** Original resolver behavior: missing legacy slots fall back to STEADY_DRIVING. */
173
+ declare const resolveDrivingExpression: (config: DrivingExpressionsConfigInput, status: CarRunningStatus) => DrivingExpressionMedia;
174
+ /** Strict resolver used by the player; official fallbacks are opt-in. */
175
+ declare const resolveDrivingExpressionStrict: (config: DrivingExpressionsConfigInput, status: CarRunningStatus, fallbacks?: Partial<Readonly<Record<CarRunningStatus, StructuredDrivingExpressionMedia>>>) => DrivingExpressionMedia;
176
+ declare const isPublicDrivingMediaUrl: (value: string) => boolean;
177
+ //#endregion
178
+ //#region src/sensor/driving_status_controller.d.ts
179
+ type DrivingStatusChangeReason = 'candidate_confirmed' | 'unavailable_fallback';
180
+ interface DrivingStatusEvent {
181
+ type: 'status_changed';
182
+ status: CarRunningStatus;
183
+ previousStatus: CarRunningStatus;
184
+ reason: DrivingStatusChangeReason;
185
+ atMs: number;
186
+ }
187
+ type DrivingStatusDiagnosticEvent = {
188
+ type: 'sample_available';
189
+ atMs: number;
190
+ capturedAtMs: number;
191
+ tuningVersion: string;
192
+ } | {
193
+ type: 'sample_unavailable';
194
+ atMs: number;
195
+ unavailableForMs: number;
196
+ category: 'provider_error' | 'invalid_or_stale_snapshot';
197
+ tuningVersion: string;
198
+ } | {
199
+ type: 'candidate_changed';
200
+ atMs: number;
201
+ candidate: CarRunningStatus | null;
202
+ previousCandidate: CarRunningStatus | null;
203
+ tuningVersion: string;
204
+ } | {
205
+ type: 'status_committed';
206
+ atMs: number;
207
+ status: CarRunningStatus;
208
+ previousStatus: CarRunningStatus;
209
+ reason: DrivingStatusChangeReason;
210
+ tuningVersion: string;
211
+ } | {
212
+ type: 'status_held_by_min_duration';
213
+ atMs: number;
214
+ status: CarRunningStatus;
215
+ candidate: CarRunningStatus;
216
+ remainingMs: number;
217
+ tuningVersion: string;
218
+ } | {
219
+ type: 'fallback_to_stopped';
220
+ atMs: number;
221
+ unavailableForMs: number;
222
+ tuningVersion: string;
223
+ };
224
+ interface DrivingControllerSnapshot {
225
+ lifecycle: 'stopped' | 'running' | 'destroyed';
226
+ status: CarRunningStatus;
227
+ candidate: CarRunningStatus | null;
228
+ candidateConfirmationCount: number;
229
+ statusCommittedAtMs: number;
230
+ lastAvailableAtMs: number | null;
231
+ unavailableSinceMs: number | null;
232
+ tuningVersion: string;
233
+ }
234
+ interface DrivingStatusClock {
235
+ now(): number;
236
+ setTimeout(callback: () => void, delayMs: number): unknown;
237
+ clearTimeout(handle: unknown): void;
238
+ }
239
+ type DrivingSensorProvider = (signal?: AbortSignal) => UnifiedSensorInfoPayload | Promise<UnifiedSensorInfoPayload>;
240
+ interface DrivingStatusControllerOptions {
241
+ sensorProvider?: DrivingSensorProvider;
242
+ pollIntervalMs?: number;
243
+ unavailableFallbackMs?: number;
244
+ tuning?: DrivingStatusTuningOverrides;
245
+ initialStatus?: CarRunningStatus;
246
+ clock?: DrivingStatusClock;
247
+ onDiagnostic?: (event: DrivingStatusDiagnosticEvent) => void;
248
+ /** Pause on Runtime/visibility/page hooks and resume only if start() is still requested. */
249
+ managePageLifecycle?: boolean;
250
+ }
251
+ interface DrivingStatusController {
252
+ start(): void;
253
+ stop(): void;
254
+ destroy(): void;
255
+ getSnapshot(): DrivingControllerSnapshot;
256
+ subscribe(listener: (event: DrivingStatusEvent) => void): () => void;
257
+ }
258
+ declare const createDrivingStatusController: (options?: DrivingStatusControllerOptions) => DrivingStatusController;
259
+ //#endregion
260
+ //#region src/sensor/driving_expression_player.d.ts
261
+ type DrivingExpressionPlayerErrorCategory = 'invalid_config' | 'network' | 'timeout' | 'decode' | 'unsupported';
262
+ type DrivingExpressionPlayerDiagnosticEvent = {
263
+ type: 'media_ready';
264
+ status: CarRunningStatus;
265
+ kind: StructuredDrivingExpressionMedia['kind'];
266
+ elapsedMs: number;
267
+ } | {
268
+ type: 'media_load_failed';
269
+ status: CarRunningStatus;
270
+ kind: StructuredDrivingExpressionMedia['kind'] | 'unknown';
271
+ category: DrivingExpressionPlayerErrorCategory;
272
+ message: string;
273
+ } | {
274
+ type: 'media_fallback_applied';
275
+ status: CarRunningStatus;
276
+ kind: StructuredDrivingExpressionMedia['kind'];
277
+ };
278
+ interface DrivingExpressionPlayerSnapshot {
279
+ lifecycle: 'active' | 'paused' | 'destroyed';
280
+ status: CarRunningStatus | null;
281
+ phase: 'idle' | 'loading' | 'ready' | 'fallback' | 'error';
282
+ mediaKind: StructuredDrivingExpressionMedia['kind'] | null;
283
+ errorCategory: DrivingExpressionPlayerErrorCategory | null;
284
+ }
285
+ interface DrivingTgsAnimationHandle {
286
+ destroy(): void;
287
+ pause?(): void;
288
+ play?(): void;
289
+ restart?(): void;
290
+ }
291
+ type DrivingTgsRenderer = (container: HTMLElement, animationData: Record<string, unknown>, signal: AbortSignal) => DrivingTgsAnimationHandle | Promise<DrivingTgsAnimationHandle>;
292
+ interface DrivingExpressionPlayerOptions {
293
+ config: DrivingExpressionsConfigInput;
294
+ fallbacks?: Partial<Readonly<Record<CarRunningStatus, StructuredDrivingExpressionMedia>>>;
295
+ loadTimeoutMs?: number;
296
+ retryBackoffMs?: number;
297
+ fit?: 'contain' | 'cover';
298
+ tgsRenderer?: DrivingTgsRenderer;
299
+ fetch?: typeof globalThis.fetch;
300
+ onDiagnostic?: (event: DrivingExpressionPlayerDiagnosticEvent) => void;
301
+ maxTgsCompressedBytes?: number;
302
+ maxTgsJsonBytes?: number;
303
+ maxTgsLayers?: number;
304
+ /** Pause/cancel work on Runtime and page lifecycle hooks. Defaults to true. */
305
+ managePageLifecycle?: boolean;
306
+ }
307
+ interface DrivingExpressionPlayer {
308
+ show(status: CarRunningStatus): Promise<void>;
309
+ pause(): void;
310
+ resume(): void;
311
+ destroy(): void;
312
+ getSnapshot(): DrivingExpressionPlayerSnapshot;
313
+ }
314
+ declare const createDrivingExpressionPlayer: (container: HTMLElement, options: DrivingExpressionPlayerOptions) => DrivingExpressionPlayer;
315
+ //#endregion
316
+ export { AvailableSensorMetric, BATTERY_HEALTH_LABELS, BatteryCapacityValue, BatteryHealth, BatteryPlugged, BatteryStateValue, BatteryStatus, CAR_RUNNING_LABELS, CAR_RUNNING_STATUSES, CAR_RUNNING_STATUS_PRIORITY, CarRunningStatus, CompleteDrivingExpressionsConfig, DEFAULT_DRIVING_STATUS_TUNING, DrivingControllerSnapshot, DrivingExpressionMedia, DrivingExpressionPlayer, DrivingExpressionPlayerDiagnosticEvent, DrivingExpressionPlayerErrorCategory, DrivingExpressionPlayerOptions, DrivingExpressionPlayerSnapshot, DrivingExpressionResolutionError, DrivingExpressionsConfig, DrivingExpressionsConfigError, DrivingExpressionsConfigErrorCode, DrivingExpressionsConfigInput, DrivingSensorProvider, DrivingSnapshotMetrics, DrivingStatusChangeReason, DrivingStatusClock, DrivingStatusController, DrivingStatusControllerOptions, DrivingStatusDiagnosticEvent, DrivingStatusEvent, DrivingStatusTuning, DrivingStatusTuningOverrides, DrivingTgsAnimationHandle, DrivingTgsRenderer, EmojiDrivingExpressionMedia, ImageDrivingExpressionMedia, LivePhotoDrivingExpressionMedia, MediaLibraryRef, OFFICIAL_DRIVING_EXPRESSIONS_CONFIG, OFFICIAL_DRIVING_EXPRESSION_FALLBACKS, OrientationValue, ParseDrivingExpressionsOptions, StructuredDrivingExpressionMedia, TgsDrivingExpressionMedia, UnavailableSensorMetric, UnifiedSensorInfoPayload, UnifiedSensorMetric, UnifiedSensorUnavailableReason, Vector3Value, VideoDrivingExpressionMedia, checkRunningStatus, classifyDrivingMetrics, classifyDrivingSnapshot, createDrivingExpressionPlayer, createDrivingStatusController, extractDrivingSnapshotMetrics, isPublicDrivingMediaUrl, parseDrivingExpressionsConfig, readDrivingExpressionsConfig, resolveDrivingExpression, resolveDrivingExpressionStrict, resolveDrivingStatusTuning, tryParseDrivingExpressionsConfig, unifiedSensorInfo };