@pickleball/expo-sdk 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +69 -0
  3. package/dist/advanced-BXDrDl1h.d.ts +316 -0
  4. package/dist/advanced-BdAa2Erv.d.cts +316 -0
  5. package/dist/advanced.cjs +35 -0
  6. package/dist/advanced.d.cts +3 -0
  7. package/dist/advanced.d.ts +3 -0
  8. package/dist/advanced.js +35 -0
  9. package/dist/chunk-2JHULJZ7.js +265 -0
  10. package/dist/chunk-6JOMESNT.js +9 -0
  11. package/dist/chunk-7OX2DSKI.cjs +33 -0
  12. package/dist/chunk-DHDX3ZOO.js +800 -0
  13. package/dist/chunk-FODE2W2H.js +1953 -0
  14. package/dist/chunk-KFQGP6VL.js +33 -0
  15. package/dist/chunk-LCWGNGEN.cjs +265 -0
  16. package/dist/chunk-TBPR2QND.cjs +1953 -0
  17. package/dist/chunk-TRLASNPQ.cjs +9 -0
  18. package/dist/chunk-YGSQ25UA.cjs +800 -0
  19. package/dist/device-agent/index.cjs +498 -0
  20. package/dist/device-agent/index.d.cts +157 -0
  21. package/dist/device-agent/index.d.ts +157 -0
  22. package/dist/device-agent/index.js +498 -0
  23. package/dist/engine-CCSSqPbZ.d.cts +516 -0
  24. package/dist/engine-CCSSqPbZ.d.ts +516 -0
  25. package/dist/index.cjs +339 -5569
  26. package/dist/index.d.cts +22 -1406
  27. package/dist/index.d.ts +22 -1406
  28. package/dist/index.js +269 -5401
  29. package/dist/match/index.cjs +2456 -0
  30. package/dist/match/index.d.cts +253 -0
  31. package/dist/match/index.d.ts +253 -0
  32. package/dist/match/index.js +2456 -0
  33. package/dist/match/remote/index.cjs +21 -0
  34. package/dist/match/remote/index.d.cts +67 -0
  35. package/dist/match/remote/index.d.ts +67 -0
  36. package/dist/match/remote/index.js +21 -0
  37. package/dist/match/voice/index.cjs +23 -0
  38. package/dist/match/voice/index.d.cts +114 -0
  39. package/dist/match/voice/index.d.ts +114 -0
  40. package/dist/match/voice/index.js +23 -0
  41. package/dist/plugin.cjs +53 -70
  42. package/dist/plugin.d.cts +13 -0
  43. package/dist/plugin.d.ts +13 -0
  44. package/dist/plugin.js +20 -15
  45. package/dist/types-CrmcX408.d.cts +176 -0
  46. package/dist/types-CrmcX408.d.ts +176 -0
  47. package/dist/types-DiKWjwvN.d.cts +96 -0
  48. package/dist/types-DiKWjwvN.d.ts +96 -0
  49. package/dist/version.cjs +4 -32
  50. package/dist/version.js +2 -1
  51. package/package.json +68 -4
  52. package/src/advanced.ts +47 -0
  53. package/src/device-agent/agent.ts +443 -0
  54. package/src/device-agent/component.tsx +49 -0
  55. package/src/device-agent/convex-control-channel.ts +82 -0
  56. package/src/device-agent/http-transport.ts +143 -0
  57. package/src/device-agent/index.ts +4 -0
  58. package/src/engine.ts +21 -5
  59. package/src/errors.ts +16 -0
  60. package/src/http-session-provider.ts +19 -13
  61. package/src/index.ts +38 -14
  62. package/src/livekit-room-adapter.ts +39 -2
  63. package/src/livestream-screen.tsx +26 -4
  64. package/src/match/index.ts +29 -0
  65. package/src/match/provider.tsx +4 -2
  66. package/src/match/remote/hid-gesture.ts +10 -2
  67. package/src/match/remote/types.ts +6 -4
  68. package/src/match/voice/scheduler.ts +6 -1
  69. package/src/match/voice/service.ts +16 -4
  70. package/src/native-runtime.ts +54 -4
  71. package/src/plugin.ts +35 -14
  72. package/src/provider.tsx +35 -4
  73. package/src/rtmp-room-adapter.ts +196 -0
  74. package/dist/chunk-VHLUJQG5.js +0 -17
@@ -0,0 +1,516 @@
1
+ type LivestreamState = "idle" | "preparing" | "preview" | "connecting"
2
+ /** Đã vào phòng, chưa phát — chờ lệnh phát từ app hoặc dashboard. */
3
+ | "standby" | "live" | "reconnecting" | "ending" | "ended" | "error";
4
+ type SdkErrorCode = "PERMISSION_DENIED" | "NETWORK_UNAVAILABLE" | "TOKEN_EXPIRED" | "SDK_UPGRADE_REQUIRED" | "SESSION_CONFLICT" | "RECORDING_FAILED" | "CONSENT_REQUIRED" | "SDK_DISABLED" | "UNKNOWN";
5
+ interface SdkError {
6
+ code: SdkErrorCode;
7
+ message: string;
8
+ }
9
+ interface BootstrapInput {
10
+ sdkVersion: string;
11
+ platform: "ios" | "android";
12
+ bundleId: string;
13
+ installationId: string;
14
+ }
15
+ interface SdkRemoteConfig {
16
+ enabled: boolean;
17
+ protocolVersion: 1;
18
+ minSdkVersion: string;
19
+ recommendedSdkVersion: string;
20
+ videoQuality: 720 | 1080;
21
+ reconnectTimeoutMs: number;
22
+ backgroundGraceMs: number;
23
+ telemetryIntervalMs: number;
24
+ maxSessionDurationMs: number;
25
+ /** Tự kết thúc phiên nếu ngồi standby quá lâu không phát (mặc định 15 phút). */
26
+ standbyTimeoutMs?: number;
27
+ }
28
+ interface SdkBootstrap {
29
+ config: SdkRemoteConfig;
30
+ serverTime: number;
31
+ rolloutEnabled: boolean;
32
+ message?: string;
33
+ }
34
+ interface StartLivestreamInput {
35
+ externalSessionId: string;
36
+ title: string;
37
+ visibility?: "public" | "private";
38
+ consentVersion: string;
39
+ metadata?: Record<string, string>;
40
+ /**
41
+ * true: vào phòng ở chế độ chờ (không publish) — server giữ status
42
+ * "scheduled" và KHÔNG khởi động recording egress cho tới khi publish.
43
+ * Engine tự đặt cờ này theo options.autoPublish; app không cần truyền.
44
+ */
45
+ standby?: boolean;
46
+ }
47
+ interface SdkTelemetryCredentials {
48
+ endpoint: string;
49
+ token: string;
50
+ expiresAt: number;
51
+ }
52
+ interface SdkSessionGrant {
53
+ sessionId: string;
54
+ serverUrl: string;
55
+ participantToken: string;
56
+ playbackUrl: string | null;
57
+ tokenExpiresAt: number;
58
+ telemetry: SdkTelemetryCredentials;
59
+ config: SdkRemoteConfig;
60
+ }
61
+ interface SdkSessionRefresh {
62
+ participantToken?: string;
63
+ tokenExpiresAt?: number;
64
+ telemetry?: SdkTelemetryCredentials;
65
+ config: SdkRemoteConfig;
66
+ }
67
+ interface EndLivestreamInput {
68
+ sessionId: string;
69
+ reason: "user" | "background_timeout" | "network_timeout" | "standby_timeout" | "error";
70
+ }
71
+ type EndReason = EndLivestreamInput["reason"];
72
+ declare const SDK_TELEMETRY_EVENT_NAMES: readonly ["state_changed", "connection_quality", "reconnect", "error", "heartbeat", "session_ended"];
73
+ type SdkTelemetryEventName = (typeof SDK_TELEMETRY_EVENT_NAMES)[number];
74
+ interface SdkTelemetryEvent {
75
+ sessionId: string;
76
+ at: number;
77
+ name: SdkTelemetryEventName;
78
+ data?: Record<string, unknown>;
79
+ }
80
+ interface LivestreamSessionProvider {
81
+ bootstrap(input: BootstrapInput): Promise<SdkBootstrap>;
82
+ start(input: StartLivestreamInput): Promise<SdkSessionGrant>;
83
+ refresh(sessionId: string): Promise<SdkSessionRefresh>;
84
+ end(input: EndLivestreamInput): Promise<void>;
85
+ /**
86
+ * Báo server bắt đầu phát thật (standby → live): server bật recording
87
+ * egress + chuyển status live TRƯỚC khi engine publish track. Optional để
88
+ * giữ tương thích provider cũ — thiếu thì engine bỏ qua bước server.
89
+ */
90
+ publish?(sessionId: string): Promise<void>;
91
+ /** Báo server tạm dừng phát (live → standby): dừng egress, status về chờ. */
92
+ unpublish?(sessionId: string): Promise<void>;
93
+ }
94
+ declare function isSdkRemoteConfig(value: unknown): value is SdkRemoteConfig;
95
+ declare function compareSemver(left: string, right: string): -1 | 0 | 1;
96
+ declare function isSdkVersionSupported(version: string, minimum: string): boolean;
97
+
98
+ type ExpoSdkErrorCode = SdkErrorCode | "CONFIGURATION_ERROR" | "UNSUPPORTED_RUNTIME" | "INVALID_RESPONSE" | "TIMEOUT";
99
+ declare class PickleballExpoError extends Error {
100
+ readonly code: ExpoSdkErrorCode;
101
+ constructor(message: string, code: ExpoSdkErrorCode, options?: ErrorOptions);
102
+ }
103
+ declare const PermissionDeniedError_base: {
104
+ new (message?: string, options?: ErrorOptions): {
105
+ readonly code: ExpoSdkErrorCode;
106
+ name: string;
107
+ message: string;
108
+ stack?: string;
109
+ cause?: unknown;
110
+ };
111
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
112
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
113
+ stackTraceLimit: number;
114
+ };
115
+ declare class PermissionDeniedError extends PermissionDeniedError_base {
116
+ }
117
+ declare const NetworkUnavailableError_base: {
118
+ new (message?: string, options?: ErrorOptions): {
119
+ readonly code: ExpoSdkErrorCode;
120
+ name: string;
121
+ message: string;
122
+ stack?: string;
123
+ cause?: unknown;
124
+ };
125
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
126
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
127
+ stackTraceLimit: number;
128
+ };
129
+ declare class NetworkUnavailableError extends NetworkUnavailableError_base {
130
+ }
131
+ declare const TokenExpiredError_base: {
132
+ new (message?: string, options?: ErrorOptions): {
133
+ readonly code: ExpoSdkErrorCode;
134
+ name: string;
135
+ message: string;
136
+ stack?: string;
137
+ cause?: unknown;
138
+ };
139
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
140
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
141
+ stackTraceLimit: number;
142
+ };
143
+ declare class TokenExpiredError extends TokenExpiredError_base {
144
+ }
145
+ declare const UnsupportedSdkError_base: {
146
+ new (message?: string, options?: ErrorOptions): {
147
+ readonly code: ExpoSdkErrorCode;
148
+ name: string;
149
+ message: string;
150
+ stack?: string;
151
+ cause?: unknown;
152
+ };
153
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
154
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
155
+ stackTraceLimit: number;
156
+ };
157
+ declare class UnsupportedSdkError extends UnsupportedSdkError_base {
158
+ }
159
+ declare const UnsupportedRuntimeError_base: {
160
+ new (message?: string, options?: ErrorOptions): {
161
+ readonly code: ExpoSdkErrorCode;
162
+ name: string;
163
+ message: string;
164
+ stack?: string;
165
+ cause?: unknown;
166
+ };
167
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
168
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
169
+ stackTraceLimit: number;
170
+ };
171
+ declare class UnsupportedRuntimeError extends UnsupportedRuntimeError_base {
172
+ }
173
+ declare const SessionConflictError_base: {
174
+ new (message?: string, options?: ErrorOptions): {
175
+ readonly code: ExpoSdkErrorCode;
176
+ name: string;
177
+ message: string;
178
+ stack?: string;
179
+ cause?: unknown;
180
+ };
181
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
182
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
183
+ stackTraceLimit: number;
184
+ };
185
+ declare class SessionConflictError extends SessionConflictError_base {
186
+ }
187
+ declare const RecordingFailureError_base: {
188
+ new (message?: string, options?: ErrorOptions): {
189
+ readonly code: ExpoSdkErrorCode;
190
+ name: string;
191
+ message: string;
192
+ stack?: string;
193
+ cause?: unknown;
194
+ };
195
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
196
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
197
+ stackTraceLimit: number;
198
+ };
199
+ declare class RecordingFailureError extends RecordingFailureError_base {
200
+ }
201
+ declare const ConsentRequiredError_base: {
202
+ new (message?: string, options?: ErrorOptions): {
203
+ readonly code: ExpoSdkErrorCode;
204
+ name: string;
205
+ message: string;
206
+ stack?: string;
207
+ cause?: unknown;
208
+ };
209
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
210
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
211
+ stackTraceLimit: number;
212
+ };
213
+ declare class ConsentRequiredError extends ConsentRequiredError_base {
214
+ }
215
+ declare const SdkDisabledError_base: {
216
+ new (message?: string, options?: ErrorOptions): {
217
+ readonly code: ExpoSdkErrorCode;
218
+ name: string;
219
+ message: string;
220
+ stack?: string;
221
+ cause?: unknown;
222
+ };
223
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
224
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
225
+ stackTraceLimit: number;
226
+ };
227
+ declare class SdkDisabledError extends SdkDisabledError_base {
228
+ }
229
+ declare const ExpoSdkConfigurationError_base: {
230
+ new (message?: string, options?: ErrorOptions): {
231
+ readonly code: ExpoSdkErrorCode;
232
+ name: string;
233
+ message: string;
234
+ stack?: string;
235
+ cause?: unknown;
236
+ };
237
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
238
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
239
+ stackTraceLimit: number;
240
+ };
241
+ declare class ExpoSdkConfigurationError extends ExpoSdkConfigurationError_base {
242
+ }
243
+ declare const InvalidResponseError_base: {
244
+ new (message?: string, options?: ErrorOptions): {
245
+ readonly code: ExpoSdkErrorCode;
246
+ name: string;
247
+ message: string;
248
+ stack?: string;
249
+ cause?: unknown;
250
+ };
251
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
252
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
253
+ stackTraceLimit: number;
254
+ };
255
+ declare class InvalidResponseError extends InvalidResponseError_base {
256
+ }
257
+ declare const ExpoSdkTimeoutError_base: {
258
+ new (message?: string, options?: ErrorOptions): {
259
+ readonly code: ExpoSdkErrorCode;
260
+ name: string;
261
+ message: string;
262
+ stack?: string;
263
+ cause?: unknown;
264
+ };
265
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
266
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
267
+ stackTraceLimit: number;
268
+ };
269
+ declare class ExpoSdkTimeoutError extends ExpoSdkTimeoutError_base {
270
+ }
271
+ declare const UnknownSdkError_base: {
272
+ new (message?: string, options?: ErrorOptions): {
273
+ readonly code: ExpoSdkErrorCode;
274
+ name: string;
275
+ message: string;
276
+ stack?: string;
277
+ cause?: unknown;
278
+ };
279
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
280
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
281
+ stackTraceLimit: number;
282
+ };
283
+ declare class UnknownSdkError extends UnknownSdkError_base {
284
+ }
285
+ declare function errorFromCode(code: string, message?: string): PickleballExpoError;
286
+ declare function normalizeError(error: unknown): PickleballExpoError;
287
+ /**
288
+ * Phiên đã biến mất hẳn phía server (HTTP 404): bị watchdog dọn, thuộc
289
+ * deployment khác, hoặc ID không hợp lệ. Khác hẳn lỗi mạng/5xx — thử lại không
290
+ * bao giờ cứu được, nên caller phải bỏ dấu khôi phục thay vì chặn vĩnh viễn.
291
+ *
292
+ * Mã HTTP được gắn vào lỗi ở http-session-provider vì envelope trả về chỉ có
293
+ * code "UNKNOWN", không phân biệt được 404 với 5xx.
294
+ */
295
+ declare function isSessionGoneError(error: unknown): boolean;
296
+
297
+ interface RoomConnection {
298
+ serverUrl: string;
299
+ participantToken: string;
300
+ microphoneEnabled: boolean;
301
+ /** false: vào phòng nhưng chưa publish track (trạng thái standby). */
302
+ publish?: boolean;
303
+ }
304
+ type RoomEvent = {
305
+ type: "reconnecting";
306
+ } | {
307
+ type: "reconnected";
308
+ } | {
309
+ type: "disconnected";
310
+ reason?: string;
311
+ } | {
312
+ type: "media-error";
313
+ error: unknown;
314
+ }
315
+ /** Lệnh điều khiển từ dashboard qua LiveKit data channel ({"type":"cmd"}). */
316
+ | {
317
+ type: "command";
318
+ action: string;
319
+ };
320
+ interface RoomAdapter {
321
+ /** Bật/tắt publish track khi đã ở trong phòng (standby ↔ live). */
322
+ setPublishing?(enabled: boolean): Promise<void>;
323
+ setCaptureOrientation?(orientation: CaptureOrientation): Promise<void>;
324
+ listCameras?(): Promise<CameraDeviceInfo[]>;
325
+ selectCamera?(deviceId: string, facing: CameraDeviceInfo["facing"]): Promise<void>;
326
+ preparePreview(quality: 720 | 1080): Promise<unknown>;
327
+ connect(input: RoomConnection): Promise<void>;
328
+ disconnect(stopTracks?: boolean): Promise<void>;
329
+ switchCamera(): Promise<void>;
330
+ setMicrophoneEnabled(enabled: boolean): Promise<void>;
331
+ subscribe(listener: (event: RoomEvent) => void): () => void;
332
+ dispose(): Promise<void>;
333
+ }
334
+ interface SdkRuntime {
335
+ assertSupported(): void;
336
+ requestPermissions(): Promise<boolean>;
337
+ activateKeepAwake(): void | Promise<void>;
338
+ deactivateKeepAwake(): void | Promise<void>;
339
+ }
340
+ interface SdkStorage {
341
+ getItem(key: string): Promise<string | null>;
342
+ setItem(key: string, value: string): Promise<void>;
343
+ removeItem(key: string): Promise<void>;
344
+ }
345
+ interface SdkNetwork {
346
+ isOnline(): boolean;
347
+ subscribe(listener: (online: boolean) => void): () => void;
348
+ }
349
+ interface TelemetrySink {
350
+ send(credentials: SdkTelemetryCredentials, events: readonly SdkTelemetryEvent[]): Promise<void>;
351
+ dispose?(): void;
352
+ }
353
+ interface EngineDependencies {
354
+ sessionProvider: LivestreamSessionProvider;
355
+ bootstrapInput: BootstrapInput;
356
+ roomFactory: () => RoomAdapter;
357
+ runtime: SdkRuntime;
358
+ storage: SdkStorage;
359
+ network: SdkNetwork;
360
+ telemetry?: TelemetrySink;
361
+ /** Thu chỉ số thiết bị; gọi mỗi nhịp heartbeat khi đang phát. */
362
+ deviceMetrics?: () => Promise<DeviceMetricsSample | null>;
363
+ now?: () => number;
364
+ }
365
+ type CaptureOrientation = "portrait" | "landscape";
366
+ interface CameraDeviceInfo {
367
+ deviceId: string;
368
+ label: string;
369
+ facing: "front" | "environment" | "unknown";
370
+ }
371
+ /** Chỉ số thiết bị gửi kèm heartbeat (trường trùng schema deviceMetrics). */
372
+ interface DeviceMetricsSample {
373
+ batteryPct?: number;
374
+ batteryTempC?: number;
375
+ thermal?: number;
376
+ ramFreeMb?: number;
377
+ ramTotalMb?: number;
378
+ storageFreeGb?: number;
379
+ netType?: string;
380
+ linkMbps?: number;
381
+ rssi?: number;
382
+ connQuality?: string;
383
+ charging?: boolean;
384
+ }
385
+ interface LivestreamSnapshot {
386
+ state: LivestreamState;
387
+ error: PickleballExpoError | null;
388
+ config: SdkRemoteConfig | null;
389
+ sessionId: string | null;
390
+ previewTrack: unknown;
391
+ isMicrophoneEnabled: boolean;
392
+ isCameraFront: boolean;
393
+ /** Explicit pre-live choice; null follows the window orientation. */
394
+ captureOrientation: CaptureOrientation | null;
395
+ /** Mẫu chỉ số thiết bị mới nhất (cập nhật mỗi heartbeat khi live). */
396
+ deviceMetrics: DeviceMetricsSample | null;
397
+ /** Cameras reported by the platform after preview was prepared. */
398
+ cameras: CameraDeviceInfo[];
399
+ /** Explicitly chosen camera; null when following facing (front/back). */
400
+ selectedCameraId: string | null;
401
+ elapsedMs: number;
402
+ isOnline: boolean;
403
+ }
404
+ declare const PENDING_END_KEY = "@pickleball/expo-sdk/pending-end";
405
+ declare const LEGAL_LIVESTREAM_TRANSITIONS: Readonly<Record<LivestreamState, readonly LivestreamState[]>>;
406
+ declare class LivestreamEngine {
407
+ private readonly dependencies;
408
+ private room?;
409
+ private readonly now;
410
+ private snapshot;
411
+ private listeners;
412
+ private preparePromise?;
413
+ private startPromise?;
414
+ private stopPromise?;
415
+ private retryPromise?;
416
+ private credentialRefreshPromise?;
417
+ private pendingReplayPromise?;
418
+ private startupRecoveryPromise?;
419
+ private startupRecovered;
420
+ private pendingReplayError?;
421
+ private ownedSessionId?;
422
+ private commandTail;
423
+ private commandCount;
424
+ private roomUnsubscribe;
425
+ private networkUnsubscribe;
426
+ private networkSubscribed;
427
+ private latestAppState;
428
+ private backgroundTimer?;
429
+ private standbyTimer?;
430
+ private reconnectTimer?;
431
+ private heartbeatTimer?;
432
+ private elapsedTimer?;
433
+ private tokenRefreshTimer?;
434
+ private maxSessionTimer?;
435
+ private grant?;
436
+ private startedAt?;
437
+ /** Đang publish track (live) hay chỉ ngồi trong phòng (standby). */
438
+ private publishing;
439
+ /** Tổng thời gian đã phát trước lần tạm dừng gần nhất. */
440
+ private pausedElapsedMs;
441
+ private sessionDeadline?;
442
+ private refreshRetryAttempt;
443
+ private operationGeneration;
444
+ private liveTimersStarted;
445
+ private keepAwakeActive;
446
+ private telemetryInFlight?;
447
+ private pendingCriticalTelemetry?;
448
+ private readonly sessionTerminations;
449
+ private disposePromise?;
450
+ private disposed;
451
+ constructor(dependencies: EngineDependencies);
452
+ getSnapshot: () => LivestreamSnapshot;
453
+ subscribe: (listener: () => void) => () => boolean;
454
+ initialize(): Promise<void>;
455
+ prepare(): Promise<void>;
456
+ private doPrepare;
457
+ start(input: StartLivestreamInput, options?: {
458
+ autoPublish?: boolean;
459
+ }): Promise<void>;
460
+ private doStart;
461
+ stop(reason?: EndReason): Promise<void>;
462
+ private doStop;
463
+ retry(): Promise<void>;
464
+ private doRetry;
465
+ switchCamera(): Promise<void>;
466
+ /** Chọn một ống kính cụ thể từ snapshot.cameras. */
467
+ selectCamera(deviceId: string): Promise<void>;
468
+ /** Chọn kiểu quay trước khi live; không đổi khi phiên đang hoạt động. */
469
+ setCaptureOrientation(orientation: CaptureOrientation): Promise<void>;
470
+ setMicrophoneEnabled(enabled: boolean): Promise<void>;
471
+ handleRoomEvent(event: RoomEvent): void;
472
+ handleAppState(state: "active" | "background" | "inactive"): void;
473
+ private ensureBackgroundGraceTimer;
474
+ dispose(): Promise<void>;
475
+ private replayPendingEnd;
476
+ private doReplayPendingEnd;
477
+ private recoverStartupSession;
478
+ private ensurePendingEndResolved;
479
+ private readPendingEnd;
480
+ private ownsInMemorySession;
481
+ private startTimers;
482
+ private clearTimers;
483
+ private clearReconnectTimer;
484
+ /** Heartbeat kèm chỉ số thiết bị (nếu collector được cung cấp). */
485
+ private sendHeartbeat;
486
+ private sendTelemetry;
487
+ private startTelemetrySend;
488
+ private refreshCredentials;
489
+ private transition;
490
+ private startStandbyTimer;
491
+ private clearStandbyTimer;
492
+ private fail;
493
+ private recordError;
494
+ private update;
495
+ private ensureState;
496
+ private ensureNotDisposed;
497
+ private ensureRoom;
498
+ private ensureNetworkSubscription;
499
+ private requireRoom;
500
+ private releaseRoom;
501
+ private enqueueLifecycle;
502
+ private scheduleTokenRefresh;
503
+ private scheduleMaxSessionDuration;
504
+ private restartHeartbeat;
505
+ private enterSession;
506
+ /** Bắt đầu phát khi đang standby (từ nút trên app hoặc lệnh dashboard). */
507
+ startPublishing(): Promise<void>;
508
+ /** Tạm dừng phát: ngắt kết nối LiveKit hoàn toàn về standby, KHÔNG kết thúc phiên. */
509
+ stopPublishing(): Promise<void>;
510
+ private ensureSessionTermination;
511
+ private abandonGrant;
512
+ private isOperationCurrent;
513
+ private ensureOperation;
514
+ }
515
+
516
+ export { UnsupportedRuntimeError as A, type BootstrapInput as B, type CameraDeviceInfo as C, type DeviceMetricsSample as D, type EndLivestreamInput as E, UnsupportedSdkError as F, compareSemver as G, errorFromCode as H, InvalidResponseError as I, isSdkRemoteConfig as J, isSdkVersionSupported as K, type LivestreamSessionProvider as L, isSessionGoneError as M, NetworkUnavailableError as N, normalizeError as O, PermissionDeniedError as P, LivestreamEngine as Q, RecordingFailureError as R, type StartLivestreamInput as S, type TelemetrySink as T, UnknownSdkError as U, type RoomConnection as V, type RoomEvent as W, type EngineDependencies as X, LEGAL_LIVESTREAM_TRANSITIONS as Y, PENDING_END_KEY as Z, type CaptureOrientation as a, ConsentRequiredError as b, type EndReason as c, ExpoSdkConfigurationError as d, type ExpoSdkErrorCode as e, ExpoSdkTimeoutError as f, type LivestreamSnapshot as g, type LivestreamState as h, PickleballExpoError as i, type RoomAdapter as j, SDK_TELEMETRY_EVENT_NAMES as k, type SdkBootstrap as l, SdkDisabledError as m, type SdkError as n, type SdkErrorCode as o, type SdkNetwork as p, type SdkRemoteConfig as q, type SdkRuntime as r, type SdkSessionGrant as s, type SdkSessionRefresh as t, type SdkStorage as u, type SdkTelemetryCredentials as v, type SdkTelemetryEvent as w, type SdkTelemetryEventName as x, SessionConflictError as y, TokenExpiredError as z };