@livepeer-frameworks/player-core 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.
Files changed (120) hide show
  1. package/dist/cjs/index.js +19493 -0
  2. package/dist/cjs/index.js.map +1 -0
  3. package/dist/esm/index.js +19398 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/player.css +2140 -0
  6. package/dist/types/core/ABRController.d.ts +164 -0
  7. package/dist/types/core/CodecUtils.d.ts +54 -0
  8. package/dist/types/core/Disposable.d.ts +61 -0
  9. package/dist/types/core/EventEmitter.d.ts +73 -0
  10. package/dist/types/core/GatewayClient.d.ts +144 -0
  11. package/dist/types/core/InteractionController.d.ts +121 -0
  12. package/dist/types/core/LiveDurationProxy.d.ts +102 -0
  13. package/dist/types/core/MetaTrackManager.d.ts +220 -0
  14. package/dist/types/core/MistReporter.d.ts +163 -0
  15. package/dist/types/core/MistSignaling.d.ts +148 -0
  16. package/dist/types/core/PlayerController.d.ts +665 -0
  17. package/dist/types/core/PlayerInterface.d.ts +230 -0
  18. package/dist/types/core/PlayerManager.d.ts +182 -0
  19. package/dist/types/core/PlayerRegistry.d.ts +27 -0
  20. package/dist/types/core/QualityMonitor.d.ts +184 -0
  21. package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
  22. package/dist/types/core/SeekingUtils.d.ts +142 -0
  23. package/dist/types/core/StreamStateClient.d.ts +108 -0
  24. package/dist/types/core/SubtitleManager.d.ts +111 -0
  25. package/dist/types/core/TelemetryReporter.d.ts +79 -0
  26. package/dist/types/core/TimeFormat.d.ts +97 -0
  27. package/dist/types/core/TimerManager.d.ts +83 -0
  28. package/dist/types/core/UrlUtils.d.ts +81 -0
  29. package/dist/types/core/detector.d.ts +149 -0
  30. package/dist/types/core/index.d.ts +49 -0
  31. package/dist/types/core/scorer.d.ts +167 -0
  32. package/dist/types/core/selector.d.ts +9 -0
  33. package/dist/types/index.d.ts +45 -0
  34. package/dist/types/lib/utils.d.ts +2 -0
  35. package/dist/types/players/DashJsPlayer.d.ts +102 -0
  36. package/dist/types/players/HlsJsPlayer.d.ts +70 -0
  37. package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
  38. package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
  39. package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
  40. package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
  41. package/dist/types/players/MistPlayer.d.ts +25 -0
  42. package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
  43. package/dist/types/players/NativePlayer.d.ts +143 -0
  44. package/dist/types/players/VideoJsPlayer.d.ts +59 -0
  45. package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
  46. package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
  47. package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
  48. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
  49. package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
  50. package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
  51. package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
  52. package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
  53. package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
  54. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
  55. package/dist/types/players/index.d.ts +14 -0
  56. package/dist/types/styles/index.d.ts +11 -0
  57. package/dist/types/types.d.ts +363 -0
  58. package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
  59. package/dist/types/vanilla/index.d.ts +19 -0
  60. package/dist/workers/decoder.worker.js +989 -0
  61. package/dist/workers/decoder.worker.js.map +1 -0
  62. package/package.json +80 -0
  63. package/src/core/ABRController.ts +550 -0
  64. package/src/core/CodecUtils.ts +257 -0
  65. package/src/core/Disposable.ts +120 -0
  66. package/src/core/EventEmitter.ts +113 -0
  67. package/src/core/GatewayClient.ts +439 -0
  68. package/src/core/InteractionController.ts +712 -0
  69. package/src/core/LiveDurationProxy.ts +270 -0
  70. package/src/core/MetaTrackManager.ts +753 -0
  71. package/src/core/MistReporter.ts +543 -0
  72. package/src/core/MistSignaling.ts +346 -0
  73. package/src/core/PlayerController.ts +2829 -0
  74. package/src/core/PlayerInterface.ts +432 -0
  75. package/src/core/PlayerManager.ts +900 -0
  76. package/src/core/PlayerRegistry.ts +149 -0
  77. package/src/core/QualityMonitor.ts +597 -0
  78. package/src/core/ScreenWakeLockManager.ts +163 -0
  79. package/src/core/SeekingUtils.ts +364 -0
  80. package/src/core/StreamStateClient.ts +457 -0
  81. package/src/core/SubtitleManager.ts +297 -0
  82. package/src/core/TelemetryReporter.ts +308 -0
  83. package/src/core/TimeFormat.ts +205 -0
  84. package/src/core/TimerManager.ts +209 -0
  85. package/src/core/UrlUtils.ts +179 -0
  86. package/src/core/detector.ts +382 -0
  87. package/src/core/index.ts +140 -0
  88. package/src/core/scorer.ts +553 -0
  89. package/src/core/selector.ts +16 -0
  90. package/src/global.d.ts +11 -0
  91. package/src/index.ts +75 -0
  92. package/src/lib/utils.ts +6 -0
  93. package/src/players/DashJsPlayer.ts +642 -0
  94. package/src/players/HlsJsPlayer.ts +483 -0
  95. package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
  96. package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
  97. package/src/players/MewsWsPlayer/index.ts +1065 -0
  98. package/src/players/MewsWsPlayer/types.ts +106 -0
  99. package/src/players/MistPlayer.ts +188 -0
  100. package/src/players/MistWebRTCPlayer/index.ts +703 -0
  101. package/src/players/NativePlayer.ts +820 -0
  102. package/src/players/VideoJsPlayer.ts +643 -0
  103. package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
  104. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
  105. package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
  106. package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
  107. package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
  108. package/src/players/WebCodecsPlayer/index.ts +1650 -0
  109. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
  110. package/src/players/WebCodecsPlayer/types.ts +542 -0
  111. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
  112. package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
  113. package/src/players/index.ts +22 -0
  114. package/src/styles/animations.css +21 -0
  115. package/src/styles/index.ts +52 -0
  116. package/src/styles/player.css +2126 -0
  117. package/src/styles/tailwind.css +1015 -0
  118. package/src/types.ts +421 -0
  119. package/src/vanilla/FrameWorksPlayer.ts +367 -0
  120. package/src/vanilla/index.ts +22 -0
@@ -0,0 +1,542 @@
1
+ /**
2
+ * WebCodecs Player Types
3
+ *
4
+ * Type definitions for the WebCodecs-based low-latency player.
5
+ */
6
+
7
+ // ============================================================================
8
+ // Latency Profile Types
9
+ // ============================================================================
10
+
11
+ export type LatencyProfileName = 'ultra-low' | 'low' | 'balanced' | 'quality';
12
+
13
+ export interface LatencyProfile {
14
+ name: string;
15
+ /** Base buffer before decoding (ms) */
16
+ keepAway: number;
17
+ /** Multiplier for jitter in buffer calculation */
18
+ jitterMultiplier: number;
19
+ /** Buffer ratio threshold to trigger speed up (e.g., 2.0 = 200%) */
20
+ speedUpThreshold: number;
21
+ /** Buffer ratio threshold to trigger slow down (e.g., 0.6 = 60%) */
22
+ speedDownThreshold: number;
23
+ /** Maximum playback speed for catchup */
24
+ maxSpeedUp: number;
25
+ /** Minimum playback speed for slowdown */
26
+ minSpeedDown: number;
27
+ /** AudioWorklet ring buffer duration (ms) */
28
+ audioBufferMs: number;
29
+ /** Whether to use optimizeForLatency hint for decoders */
30
+ optimizeForLatency: boolean;
31
+ }
32
+
33
+ // ============================================================================
34
+ // Raw Chunk Types (12-byte binary header protocol)
35
+ // ============================================================================
36
+
37
+ export type ChunkType = 'key' | 'delta' | 'init';
38
+
39
+ export interface RawChunk {
40
+ /** Track index from server */
41
+ trackIndex: number;
42
+ /** Frame type: key (keyframe), delta (P/B frame), init (codec init data) */
43
+ type: ChunkType;
44
+ /** Presentation timestamp in milliseconds */
45
+ timestamp: number;
46
+ /** Server-calculated offset in milliseconds (for A/V sync) */
47
+ offset: number;
48
+ /** Actual frame data */
49
+ data: Uint8Array;
50
+ }
51
+
52
+ // ============================================================================
53
+ // Track Types
54
+ // ============================================================================
55
+
56
+ export type TrackType = 'video' | 'audio' | 'meta';
57
+
58
+ export interface TrackInfo {
59
+ idx: number;
60
+ type: TrackType;
61
+ codec: string;
62
+ codecstring?: string;
63
+ init?: string;
64
+ // Video-specific
65
+ width?: number;
66
+ height?: number;
67
+ fpks?: number; // frames per kilosecond
68
+ // Audio-specific
69
+ channels?: number;
70
+ rate?: number; // sample rate
71
+ size?: number; // bits per sample
72
+ }
73
+
74
+ // ============================================================================
75
+ // WebSocket Control Messages
76
+ // ============================================================================
77
+
78
+ export type ControlMessageType =
79
+ | 'codec_data'
80
+ | 'info'
81
+ | 'on_time'
82
+ | 'tracks'
83
+ | 'set_speed'
84
+ | 'pause'
85
+ | 'on_stop'
86
+ | 'error';
87
+
88
+ export interface CodecDataMessage {
89
+ type: 'codec_data';
90
+ /** Current stream position in milliseconds */
91
+ current?: number;
92
+ /** List of WebCodecs-compatible codec strings (e.g., "avc1.42001f", "mp4a.40.2") */
93
+ codecs?: string[];
94
+ /** Track indices selected by server based on supported_combinations */
95
+ tracks?: number[];
96
+ }
97
+
98
+ /**
99
+ * Stream info message with track metadata
100
+ * Sent by MistServer with full stream information
101
+ */
102
+ export interface InfoMessage {
103
+ type: 'info';
104
+ /** Stream metadata including tracks */
105
+ meta?: {
106
+ tracks?: Record<string, TrackInfo>;
107
+ };
108
+ /** Stream type ('live' or 'vod') */
109
+ type_?: string;
110
+ }
111
+
112
+ export interface OnTimeMessage {
113
+ type: 'on_time';
114
+ /** Current playback time (seconds) */
115
+ current: number;
116
+ /** Total duration (seconds, Infinity for live) */
117
+ total: number;
118
+ /** Available buffer end time (seconds) */
119
+ available?: number;
120
+ /** End time of available content (seconds) */
121
+ end?: number;
122
+ /** Server-reported jitter (ms) */
123
+ jitter?: number;
124
+ /** Current play rate */
125
+ play_rate?: number | 'auto';
126
+ /** Current play rate (alias) */
127
+ play_rate_curr?: number | 'auto' | 'fast-forward';
128
+ /** Active track indices */
129
+ tracks?: number[];
130
+ }
131
+
132
+ export interface TracksMessage {
133
+ type: 'tracks';
134
+ tracks: TrackInfo[];
135
+ codecs?: string[];
136
+ }
137
+
138
+ export interface SetSpeedMessage {
139
+ type: 'set_speed';
140
+ play_rate: number | 'auto';
141
+ }
142
+
143
+ export interface PauseMessage {
144
+ type: 'pause';
145
+ }
146
+
147
+ export interface OnStopMessage {
148
+ type: 'on_stop';
149
+ }
150
+
151
+ export interface ErrorMessage {
152
+ type: 'error';
153
+ message: string;
154
+ }
155
+
156
+ export type ControlMessage =
157
+ | CodecDataMessage
158
+ | InfoMessage
159
+ | OnTimeMessage
160
+ | TracksMessage
161
+ | SetSpeedMessage
162
+ | PauseMessage
163
+ | OnStopMessage
164
+ | ErrorMessage;
165
+
166
+ // Outbound control commands
167
+ export interface PlayCommand {
168
+ type: 'play';
169
+ }
170
+
171
+ export interface HoldCommand {
172
+ type: 'hold';
173
+ }
174
+
175
+ export interface SeekCommand {
176
+ type: 'seek';
177
+ seek_time: number; // milliseconds
178
+ ff_add?: number; // fast-forward buffer request (ms)
179
+ }
180
+
181
+ export interface SetSpeedCommand {
182
+ type: 'set_speed';
183
+ play_rate: number | 'auto';
184
+ }
185
+
186
+ export interface RequestCodecDataCommand {
187
+ type: 'request_codec_data';
188
+ /** Supported codec combinations - array of [video codecs[], audio codecs[]] */
189
+ supported_combinations?: string[][][];
190
+ }
191
+
192
+ export interface FastForwardCommand {
193
+ type: 'fast_forward';
194
+ ff_add: number; // milliseconds of additional data to request
195
+ }
196
+
197
+ export type ControlCommand =
198
+ | PlayCommand
199
+ | HoldCommand
200
+ | SeekCommand
201
+ | SetSpeedCommand
202
+ | RequestCodecDataCommand
203
+ | FastForwardCommand;
204
+
205
+ // ============================================================================
206
+ // Worker Message Types
207
+ // ============================================================================
208
+
209
+ // Main thread -> Worker messages
210
+ export interface CreatePipelineMessage {
211
+ type: 'create';
212
+ idx: number;
213
+ track: TrackInfo;
214
+ opts: {
215
+ optimizeForLatency: boolean;
216
+ };
217
+ uid?: number;
218
+ }
219
+
220
+ export interface ConfigurePipelineMessage {
221
+ type: 'configure';
222
+ idx: number;
223
+ header: Uint8Array;
224
+ uid?: number;
225
+ }
226
+
227
+ export interface ReceiveChunkMessage {
228
+ type: 'receive';
229
+ idx: number;
230
+ chunk: {
231
+ type: 'key' | 'delta';
232
+ timestamp: number; // microseconds
233
+ data: Uint8Array;
234
+ };
235
+ uid?: number;
236
+ }
237
+
238
+ export interface SetWritableMessage {
239
+ type: 'setwritable';
240
+ idx: number;
241
+ writable: WritableStream;
242
+ uid?: number;
243
+ }
244
+
245
+ export interface CreateGeneratorMessage {
246
+ type: 'creategenerator';
247
+ idx: number;
248
+ uid?: number;
249
+ }
250
+
251
+ export interface ClosePipelineMessage {
252
+ type: 'close';
253
+ idx: number;
254
+ waitEmpty?: boolean;
255
+ uid?: number;
256
+ }
257
+
258
+ export interface FrameTimingMessage {
259
+ type: 'frametiming';
260
+ action: 'setSpeed' | 'reset';
261
+ speed?: number;
262
+ tweak?: number;
263
+ uid?: number;
264
+ }
265
+
266
+ export interface SeekWorkerMessage {
267
+ type: 'seek';
268
+ seekTime: number; // milliseconds
269
+ uid?: number;
270
+ }
271
+
272
+ export interface DebuggingMessage {
273
+ type: 'debugging';
274
+ value: boolean | 'verbose';
275
+ uid?: number;
276
+ }
277
+
278
+ export type MainToWorkerMessage =
279
+ | CreatePipelineMessage
280
+ | ConfigurePipelineMessage
281
+ | ReceiveChunkMessage
282
+ | SetWritableMessage
283
+ | CreateGeneratorMessage
284
+ | ClosePipelineMessage
285
+ | FrameTimingMessage
286
+ | SeekWorkerMessage
287
+ | DebuggingMessage;
288
+
289
+ // Worker -> Main thread messages
290
+ export interface AddTrackMessage {
291
+ type: 'addtrack';
292
+ idx: number;
293
+ track?: MediaStreamTrack; // Safari only
294
+ uid?: number;
295
+ }
296
+
297
+ export interface RemoveTrackMessage {
298
+ type: 'removetrack';
299
+ idx: number;
300
+ uid?: number;
301
+ }
302
+
303
+ export interface SetPlaybackRateMessage {
304
+ type: 'setplaybackrate';
305
+ speed: number;
306
+ uid?: number;
307
+ }
308
+
309
+ export interface ClosedMessage {
310
+ type: 'closed';
311
+ idx: number;
312
+ uid?: number;
313
+ }
314
+
315
+ export interface LogMessage {
316
+ type: 'log';
317
+ msg: string;
318
+ level?: 'info' | 'warn' | 'error';
319
+ uid?: number;
320
+ }
321
+
322
+ export interface SendEventMessage {
323
+ type: 'sendevent';
324
+ kind: string;
325
+ message?: string;
326
+ idx?: number;
327
+ uid?: number;
328
+ }
329
+
330
+ export interface StatsMessage {
331
+ type: 'stats';
332
+ stats: WorkerStats;
333
+ uid?: number;
334
+ }
335
+
336
+ export interface AckMessage {
337
+ type: 'ack';
338
+ idx?: number;
339
+ uid?: number;
340
+ status?: 'ok' | 'error';
341
+ error?: string;
342
+ }
343
+
344
+ export type WorkerToMainMessage =
345
+ | AddTrackMessage
346
+ | RemoveTrackMessage
347
+ | SetPlaybackRateMessage
348
+ | ClosedMessage
349
+ | LogMessage
350
+ | SendEventMessage
351
+ | StatsMessage
352
+ | AckMessage;
353
+
354
+ // ============================================================================
355
+ // Stats Types
356
+ // ============================================================================
357
+
358
+ export interface FrameTimingStats {
359
+ /** Timestamp when frame entered decoder (microseconds) */
360
+ in: number;
361
+ /** Timestamp when frame exited decoder (microseconds) */
362
+ decoded: number;
363
+ /** Timestamp when frame reached trackwriter (microseconds) */
364
+ out: number;
365
+ speed: {
366
+ main: number;
367
+ tweak: number;
368
+ combined: number;
369
+ };
370
+ seeking: boolean;
371
+ paused: boolean;
372
+ }
373
+
374
+ export interface PipelineStats {
375
+ /** How early frames arrive at trackwriter (negative = late) */
376
+ early: number | null;
377
+ /** Duration between frames (ms) */
378
+ frameDuration: number | null;
379
+ frames: {
380
+ in: number;
381
+ decoded: number;
382
+ out: number;
383
+ };
384
+ queues: {
385
+ in: number;
386
+ decoder: number;
387
+ out: number;
388
+ };
389
+ timing: {
390
+ decoder: FrameTrackerStats;
391
+ writable: FrameTrackerStats;
392
+ };
393
+ }
394
+
395
+ export interface FrameTrackerStats {
396
+ lastIn: number | undefined;
397
+ lastOut: number | undefined;
398
+ delay: number | undefined;
399
+ delta: number | undefined;
400
+ shift: number | undefined;
401
+ }
402
+
403
+ export interface WorkerStats {
404
+ frameTiming: FrameTimingStats;
405
+ pipelines: Record<number, PipelineStats>;
406
+ }
407
+
408
+ // ============================================================================
409
+ // Sync Controller Types
410
+ // ============================================================================
411
+
412
+ export interface BufferState {
413
+ /** Current buffer level (ms) */
414
+ current: number;
415
+ /** Desired buffer level (ms) */
416
+ desired: number;
417
+ /** Ratio of current/desired */
418
+ ratio: number;
419
+ }
420
+
421
+ export interface JitterState {
422
+ /** Current jitter estimate (ms) */
423
+ current: number;
424
+ /** Peak jitter over sliding window (ms) */
425
+ peak: number;
426
+ /** Weighted average jitter (ms) */
427
+ weighted: number;
428
+ }
429
+
430
+ export interface SyncState {
431
+ buffer: BufferState;
432
+ jitter: JitterState;
433
+ /** Current playback speed (main * tweak) */
434
+ playbackSpeed: number;
435
+ /** Server-reported current time (seconds) */
436
+ serverTime: number;
437
+ /** Server delay estimate (ms) */
438
+ serverDelay: number;
439
+ /** A/V sync offset (ms, positive = audio ahead) */
440
+ avOffset: number;
441
+ }
442
+
443
+ // ============================================================================
444
+ // Event Types
445
+ // ============================================================================
446
+
447
+ export interface WebCodecsPlayerEvents {
448
+ ready: HTMLVideoElement;
449
+ error: string | Error;
450
+ play: void;
451
+ pause: void;
452
+ ended: void;
453
+ timeupdate: number;
454
+ waiting: void;
455
+ playing: void;
456
+ seeking: void;
457
+ seeked: void;
458
+ progress: void;
459
+ trackchange: { trackIndex: number; type: TrackType };
460
+ statsupdate: SyncState;
461
+ }
462
+
463
+ // ============================================================================
464
+ // Player Options Extensions
465
+ // ============================================================================
466
+
467
+ export interface WebCodecsPlayerOptions {
468
+ /** Latency profile preset */
469
+ latencyProfile?: LatencyProfileName;
470
+ /** Custom latency profile (overrides preset) */
471
+ customLatencyProfile?: Partial<LatencyProfile>;
472
+ /** Enable debug logging */
473
+ debug?: boolean;
474
+ /** Enable verbose frame logging */
475
+ verboseDebug?: boolean;
476
+ /** Stats update interval (ms), 0 to disable */
477
+ statsInterval?: number;
478
+ }
479
+
480
+ // ============================================================================
481
+ // Public Stats API (Phase 2A)
482
+ // ============================================================================
483
+
484
+ /**
485
+ * Comprehensive player statistics for monitoring and debugging
486
+ */
487
+ export interface WebCodecsStats {
488
+ /** Latency/buffer statistics */
489
+ latency: {
490
+ /** Current buffer level (ms) */
491
+ buffer: number;
492
+ /** Target buffer level (ms) */
493
+ target: number;
494
+ /** Estimated network jitter (ms) */
495
+ jitter: number;
496
+ };
497
+ /** Audio/Video sync statistics */
498
+ sync: {
499
+ /** A/V drift (ms, positive = video ahead of audio) */
500
+ avDrift: number;
501
+ /** Current playback speed (including adjustments) */
502
+ playbackSpeed: number;
503
+ };
504
+ /** Decoder statistics */
505
+ decoder: {
506
+ /** Video decoder queue size */
507
+ videoQueueSize: number;
508
+ /** Audio decoder queue size */
509
+ audioQueueSize: number;
510
+ /** Total frames dropped */
511
+ framesDropped: number;
512
+ /** Total frames decoded */
513
+ framesDecoded: number;
514
+ };
515
+ /** Network statistics */
516
+ network: {
517
+ /** Total bytes received */
518
+ bytesReceived: number;
519
+ /** Total messages received */
520
+ messagesReceived: number;
521
+ };
522
+ }
523
+
524
+ // ============================================================================
525
+ // Utility Types
526
+ // ============================================================================
527
+
528
+ export interface DeferredPromise<T> {
529
+ promise: Promise<T>;
530
+ resolve: (value: T) => void;
531
+ reject: (reason?: any) => void;
532
+ }
533
+
534
+ export function createDeferredPromise<T>(): DeferredPromise<T> {
535
+ let resolve!: (value: T) => void;
536
+ let reject!: (reason?: any) => void;
537
+ const promise = new Promise<T>((res, rej) => {
538
+ resolve = res;
539
+ reject = rej;
540
+ });
541
+ return { promise, resolve, reject };
542
+ }