@axsnull/audio-sync-engine 1.0.3 → 1.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 (40) hide show
  1. package/dist/audio-clock.d.ts.map +1 -1
  2. package/dist/audio-clock.js +3 -3
  3. package/dist/audio-clock.js.map +1 -1
  4. package/dist/audio-sync-engine.d.ts +6 -3
  5. package/dist/audio-sync-engine.d.ts.map +1 -1
  6. package/dist/audio-sync-engine.js +24 -10
  7. package/dist/audio-sync-engine.js.map +1 -1
  8. package/dist/buffer-manager.d.ts.map +1 -1
  9. package/dist/buffer-manager.js +1 -1
  10. package/dist/buffer-manager.js.map +1 -1
  11. package/dist/clock-sync.d.ts +1 -1
  12. package/dist/clock-sync.d.ts.map +1 -1
  13. package/dist/clock-sync.js +1 -1
  14. package/dist/clock-sync.js.map +1 -1
  15. package/dist/drift-corrector.d.ts +1 -1
  16. package/dist/drift-corrector.d.ts.map +1 -1
  17. package/dist/drift-corrector.js +8 -8
  18. package/dist/drift-corrector.js.map +1 -1
  19. package/dist/drift-detector.d.ts +1 -1
  20. package/dist/drift-detector.d.ts.map +1 -1
  21. package/dist/drift-detector.js +4 -4
  22. package/dist/drift-detector.js.map +1 -1
  23. package/dist/index.d.ts +10 -9
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/periodic-sync.d.ts.map +1 -1
  28. package/dist/periodic-sync.js.map +1 -1
  29. package/dist/playback-state-reducer.d.ts +17 -0
  30. package/dist/playback-state-reducer.d.ts.map +1 -0
  31. package/dist/playback-state-reducer.js +63 -0
  32. package/dist/playback-state-reducer.js.map +1 -0
  33. package/dist/player-state-sync.d.ts +24 -8
  34. package/dist/player-state-sync.d.ts.map +1 -1
  35. package/dist/player-state-sync.js +64 -12
  36. package/dist/player-state-sync.js.map +1 -1
  37. package/dist/synchronized-start.d.ts.map +1 -1
  38. package/dist/synchronized-start.js +1 -1
  39. package/dist/synchronized-start.js.map +1 -1
  40. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"audio-clock.d.ts","sourceRoot":"","sources":["../src/audio-clock.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACtB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,SAAS,CAAkB;;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,IAAI,IAAI,IAAI;IAKZ,cAAc,IAAI,MAAM;IAQxB,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC,cAAc,IAAI,OAAO;IAIzB,iBAAiB,IAAI,MAAM;IAI3B,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAG1C"}
1
+ {"version":3,"file":"audio-clock.d.ts","sourceRoot":"","sources":["../src/audio-clock.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,SAAS,CAAkB;;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,IAAI,IAAI,IAAI;IAKZ,cAAc,IAAI,MAAM;IAQxB,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC,cAAc,IAAI,OAAO;IAIzB,iBAAiB,IAAI,MAAM;IAI3B,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAG3C"}
@@ -6,15 +6,15 @@ class AudioClock {
6
6
  this.audioContext = null;
7
7
  this.audioStartTime = 0;
8
8
  this.isPlaying = false;
9
- if (typeof window !== 'undefined' && window.AudioContext) {
9
+ if (typeof window !== "undefined" && window.AudioContext) {
10
10
  this.audioContext = new AudioContext();
11
11
  }
12
12
  }
13
13
  async start() {
14
14
  if (!this.audioContext) {
15
- throw new Error('AudioContext not available');
15
+ throw new Error("AudioContext not available");
16
16
  }
17
- if (this.audioContext.state === 'suspended') {
17
+ if (this.audioContext.state === "suspended") {
18
18
  await this.audioContext.resume();
19
19
  }
20
20
  this.audioStartTime = Date.now();
@@ -1 +1 @@
1
- {"version":3,"file":"audio-clock.js","sourceRoot":"","sources":["../src/audio-clock.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKtB;QAJQ,iBAAY,GAAwB,IAAI,CAAC;QACzC,mBAAc,GAAW,CAAC,CAAC;QAC3B,cAAS,GAAY,KAAK,CAAC;QAGlC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,IAAI;QACH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,cAAc;QACb,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,OAAO,CAAC,CAAC;QACV,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;IACnE,CAAC;IAED,eAAe;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,cAAc;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,iBAAiB;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,SAAiB;QAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IACjC,CAAC;CACD;AApDD,gCAoDC"}
1
+ {"version":3,"file":"audio-clock.js","sourceRoot":"","sources":["../src/audio-clock.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKrB;QAJQ,iBAAY,GAAwB,IAAI,CAAC;QACzC,mBAAc,GAAW,CAAC,CAAC;QAC3B,cAAS,GAAY,KAAK,CAAC;QAGjC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;IACpE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,iBAAiB,CAAC,SAAiB;QACjC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;CACF;AApDD,gCAoDC"}
@@ -1,5 +1,6 @@
1
- import { PlayerState, TrackMetadata } from './player-state-sync';
2
- export interface AudioSyncEngineConfig {
1
+ import { PlayerState, TrackMetadata, type PlayerStateSyncConfig } from "./player-state-sync";
2
+ import type { ReducePlayerUpdateResult } from "./playback-state-reducer";
3
+ export interface AudioSyncEngineConfig extends PlayerStateSyncConfig {
3
4
  syncIntervalMs?: number;
4
5
  bufferMinSeconds?: number;
5
6
  bufferMaxSeconds?: number;
@@ -18,7 +19,7 @@ export declare class AudioSyncEngine {
18
19
  private loadTrackFn;
19
20
  constructor(_sendPing: (timestamp: number) => Promise<number>, config?: AudioSyncEngineConfig);
20
21
  initialize(audio: HTMLAudioElement, loadTrack: (trackId: string) => Promise<TrackMetadata>): Promise<void>;
21
- handlePlayerUpdate(state: PlayerState): Promise<void>;
22
+ handlePlayerUpdate(state: PlayerState, lastEventSeq?: number): Promise<ReducePlayerUpdateResult>;
22
23
  performPeriodicSync(): Promise<void>;
23
24
  scheduleSynchronizedStart(serverStartAt: number): Promise<{
24
25
  startAt: number;
@@ -28,6 +29,8 @@ export declare class AudioSyncEngine {
28
29
  getSyncedNow(): number;
29
30
  getClockOffset(): number;
30
31
  getClockLatency(): number;
32
+ getLastState(): PlayerState | null;
33
+ getLastAppliedStateVersion(): number;
31
34
  stop(): void;
32
35
  private createAudioAdapter;
33
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audio-sync-engine.d.ts","sourceRoot":"","sources":["../src/audio-sync-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKlF,MAAM,WAAW,qBAAqB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,WAAW,CAA8D;gBAGhF,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EACjD,MAAM,GAAE,qBAA0B;IAuB7B,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1G,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBpC,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkB7F,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,YAAY,IAAI,MAAM;IAItB,cAAc,IAAI,MAAM;IAIxB,eAAe,IAAI,MAAM;IAIzB,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,kBAAkB;CAgB1B"}
1
+ {"version":3,"file":"audio-sync-engine.d.ts","sourceRoot":"","sources":["../src/audio-sync-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,WAAW,EACX,aAAa,EACb,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,WAAW,CACZ;gBAGL,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EACjD,MAAM,GAAE,qBAA0B;IA6B9B,UAAU,CACd,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC;IAQV,kBAAkB,CACtB,KAAK,EAAE,WAAW,EAClB,YAAY,GAAE,MAAU,GACvB,OAAO,CAAC,wBAAwB,CAAC;IA2B9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBpC,yBAAyB,CAC7B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBxC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,YAAY,IAAI,MAAM;IAItB,cAAc,IAAI,MAAM;IAIxB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,WAAW,GAAG,IAAI;IAIlC,0BAA0B,IAAI,MAAM;IAIpC,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,kBAAkB;CAgB3B"}
@@ -17,17 +17,21 @@ class AudioSyncEngine {
17
17
  this.audioClock = new audio_clock_1.AudioClock();
18
18
  this.driftDetector = new drift_detector_1.DriftDetector(this.clockSync);
19
19
  this.driftCorrector = new drift_corrector_1.DriftCorrector();
20
- this.playerStateSync = new player_state_sync_1.PlayerStateSync();
20
+ this.playerStateSync = new player_state_sync_1.PlayerStateSync({
21
+ deviceId: config.deviceId,
22
+ seekDriftThresholdSeconds: config.seekDriftThresholdSeconds,
23
+ activationDriftThresholdSeconds: config.activationDriftThresholdSeconds,
24
+ });
21
25
  this.synchronizedStart = new synchronized_start_1.SynchronizedStart();
22
26
  const bufferConfig = {
23
27
  minBufferSeconds: config.bufferMinSeconds ?? 3,
24
28
  maxBufferSeconds: config.bufferMaxSeconds ?? 10,
25
- targetBufferSeconds: config.bufferTargetSeconds ?? 5
29
+ targetBufferSeconds: config.bufferTargetSeconds ?? 5,
26
30
  };
27
31
  this.bufferManager = new buffer_manager_1.BufferManager(bufferConfig);
28
32
  const syncConfig = {
29
33
  intervalMs: config.syncIntervalMs ?? 1500,
30
- enabled: true
34
+ enabled: true,
31
35
  };
32
36
  this.periodicSync = new periodic_sync_1.PeriodicSync(syncConfig, () => this.performPeriodicSync());
33
37
  }
@@ -37,9 +41,9 @@ class AudioSyncEngine {
37
41
  await this.clockSync.sync();
38
42
  this.periodicSync.start();
39
43
  }
40
- async handlePlayerUpdate(state) {
44
+ async handlePlayerUpdate(state, lastEventSeq = 0) {
41
45
  if (!this.currentAudio || !this.loadTrackFn) {
42
- throw new Error('AudioSyncEngine not initialized');
46
+ throw new Error("AudioSyncEngine not initialized");
43
47
  }
44
48
  await this.clockSync.sync();
45
49
  const audioAdapter = {
@@ -51,9 +55,9 @@ class AudioSyncEngine {
51
55
  if (this.currentAudio) {
52
56
  this.currentAudio.currentTime = value;
53
57
  }
54
- }
58
+ },
55
59
  };
56
- this.playerStateSync.handlePlayerUpdate(state, audioAdapter, this.loadTrackFn);
60
+ return this.playerStateSync.handlePlayerUpdate(state, audioAdapter, this.loadTrackFn, lastEventSeq);
57
61
  }
58
62
  async performPeriodicSync() {
59
63
  if (!this.currentAudio) {
@@ -64,13 +68,17 @@ class AudioSyncEngine {
64
68
  return;
65
69
  }
66
70
  const actualPosition = this.currentAudio.currentTime * 1000;
67
- const driftResult = this.driftDetector.calculateDrift({ positionMs: lastState.positionMs, updatedAt: lastState.updatedAt, isPlaying: lastState.isPlaying }, actualPosition);
71
+ const driftResult = this.driftDetector.calculateDrift({
72
+ positionMs: lastState.positionMs,
73
+ updatedAt: lastState.updatedAt,
74
+ isPlaying: lastState.isPlaying,
75
+ }, actualPosition);
68
76
  const audioAdapter = this.createAudioAdapter(this.currentAudio);
69
77
  this.driftCorrector.correct(driftResult.drift, audioAdapter);
70
78
  }
71
79
  async scheduleSynchronizedStart(serverStartAt) {
72
80
  if (!this.currentAudio) {
73
- throw new Error('AudioSyncEngine not initialized');
81
+ throw new Error("AudioSyncEngine not initialized");
74
82
  }
75
83
  const schedule = this.synchronizedStart.scheduleStart(serverStartAt, () => this.clockSync.syncedNow(), () => {
76
84
  if (this.currentAudio) {
@@ -91,6 +99,12 @@ class AudioSyncEngine {
91
99
  getClockLatency() {
92
100
  return this.clockSync.getLatency();
93
101
  }
102
+ getLastState() {
103
+ return this.playerStateSync.getLastState();
104
+ }
105
+ getLastAppliedStateVersion() {
106
+ return this.playerStateSync.getLastAppliedStateVersion();
107
+ }
94
108
  stop() {
95
109
  this.periodicSync.stop();
96
110
  this.audioClock.stop();
@@ -109,7 +123,7 @@ class AudioSyncEngine {
109
123
  },
110
124
  set playbackRate(value) {
111
125
  audio.playbackRate = value;
112
- }
126
+ },
113
127
  };
114
128
  }
115
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audio-sync-engine.js","sourceRoot":"","sources":["../src/audio-sync-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-sync-engine.js","sourceRoot":"","sources":["../src/audio-sync-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buffer-manager.d.ts","sourceRoot":"","sources":["../src/buffer-manager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,aAAa;IAIb,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAAS;gBAEC,MAAM,EAAE,YAAY;IAEjD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAQjD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKvC,aAAa,IAAI,IAAI;IAIrB,eAAe,IAAI;QAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,WAAW,EAAE,OAAO,CAAC;KACrB;IAOD,KAAK,IAAI,IAAI;IAKb,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAOrD,eAAe,IAAI,MAAM;CAGzB"}
1
+ {"version":3,"file":"buffer-manager.d.ts","sourceRoot":"","sources":["../src/buffer-manager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAAS;gBAEC,MAAM,EAAE,YAAY;IAEjD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAQjD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKvC,aAAa,IAAI,IAAI;IAIrB,eAAe,IAAI;QACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,WAAW,EAAE,OAAO,CAAC;KACtB;IAOD,KAAK,IAAI,IAAI;IAKb,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAOrD,eAAe,IAAI,MAAM;CAG1B"}
@@ -23,7 +23,7 @@ class BufferManager {
23
23
  getBufferStatus() {
24
24
  return {
25
25
  currentStreamUrl: this.currentStreamUrl,
26
- isBuffering: this.isBuffering
26
+ isBuffering: this.isBuffering,
27
27
  };
28
28
  }
29
29
  reset() {
@@ -1 +1 @@
1
- {"version":3,"file":"buffer-manager.js","sourceRoot":"","sources":["../src/buffer-manager.ts"],"names":[],"mappings":";;;AAMA,MAAa,aAAa;IAIzB,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QAHzC,qBAAgB,GAAkB,IAAI,CAAC;QACvC,gBAAW,GAAG,KAAK,CAAC;IAEwB,CAAC;IAErD,kBAAkB,CAAC,YAAoB;QACtC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,YAAY,KAAK,IAAI,CAAC,gBAAgB,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,SAAiB;QAC/B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,eAAe;QAId,OAAO;YACN,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC;IACH,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,mBAAmB,CAAC,eAAuB;QAC1C,OAAO,CACN,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC/C,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC/C,CAAC;IACH,CAAC;IAED,eAAe;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACxC,CAAC;CACD;AAhDD,sCAgDC"}
1
+ {"version":3,"file":"buffer-manager.js","sourceRoot":"","sources":["../src/buffer-manager.ts"],"names":[],"mappings":";;;AAMA,MAAa,aAAa;IAIxB,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QAHzC,qBAAgB,GAAkB,IAAI,CAAC;QACvC,gBAAW,GAAG,KAAK,CAAC;IAEwB,CAAC;IAErD,kBAAkB,CAAC,YAAoB;QACrC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,YAAY,KAAK,IAAI,CAAC,gBAAgB,CAAC;IAChD,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,eAAe;QAIb,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,mBAAmB,CAAC,eAAuB;QACzC,OAAO,CACL,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC/C,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAChD,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACzC,CAAC;CACF;AAhDD,sCAgDC"}
@@ -4,7 +4,7 @@ export interface ClockSyncResult {
4
4
  syncedNow: number;
5
5
  }
6
6
  export interface PingPongMessage {
7
- type: 'ping' | 'pong';
7
+ type: "ping" | "pong";
8
8
  clientTimestamp: number;
9
9
  serverTimestamp?: number;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clock-sync.d.ts","sourceRoot":"","sources":["../src/clock-sync.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,SAAS;IAMT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;gBAEjB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IAEvE,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAgBtC,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,MAAM;IAIpB,WAAW,IAAI,MAAM;IAIrB,OAAO,IAAI,OAAO;CAGlB"}
1
+ {"version":3,"file":"clock-sync.d.ts","sourceRoot":"","sources":["../src/clock-sync.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,SAAS;IAOlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;gBAG3B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IAG7D,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAgBtC,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,MAAM;IAIpB,WAAW,IAAI,MAAM;IAIrB,OAAO,IAAI,OAAO;CAGnB"}
@@ -19,7 +19,7 @@ class ClockSync {
19
19
  return {
20
20
  offset: this.offset,
21
21
  latency: this.latency,
22
- syncedNow: this.syncedNow()
22
+ syncedNow: this.syncedNow(),
23
23
  };
24
24
  }
25
25
  syncedNow() {
@@ -1 +1 @@
1
- {"version":3,"file":"clock-sync.js","sourceRoot":"","sources":["../src/clock-sync.ts"],"names":[],"mappings":";;;AAYA,MAAa,SAAS;IAMrB,YAA6B,QAAgD;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;QALrE,WAAM,GAAW,CAAC,CAAC;QACnB,YAAO,GAAW,CAAC,CAAC;QACpB,aAAQ,GAAW,CAAC,CAAC;QACZ,iBAAY,GAAW,KAAK,CAAC;IAEkC,CAAC;IAEjF,KAAK,CAAC,IAAI;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEtB,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE3B,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;SAC3B,CAAC;IACH,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,UAAU;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,WAAW;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;IACvD,CAAC;CACD;AA3CD,8BA2CC"}
1
+ {"version":3,"file":"clock-sync.js","sourceRoot":"","sources":["../src/clock-sync.ts"],"names":[],"mappings":";;;AAYA,MAAa,SAAS;IAMpB,YACmB,QAAgD;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;QAN3D,WAAM,GAAW,CAAC,CAAC;QACnB,YAAO,GAAW,CAAC,CAAC;QACpB,aAAQ,GAAW,CAAC,CAAC;QACZ,iBAAY,GAAW,KAAK,CAAC;IAI3C,CAAC;IAEJ,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEtB,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE3B,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;IACxD,CAAC;CACF;AA7CD,8BA6CC"}
@@ -1,6 +1,6 @@
1
1
  export interface CorrectionResult {
2
2
  applied: boolean;
3
- method: 'ignore' | 'soft' | 'hard';
3
+ method: "ignore" | "soft" | "hard";
4
4
  adjustment: number;
5
5
  playbackRate?: number;
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"drift-corrector.d.ts","sourceRoot":"","sources":["../src/drift-corrector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,WAAW,IAAI,MAAM,CAAC;IAC1B,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;IAC/B,IAAI,YAAY,IAAI,MAAM,CAAC;IAC3B,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;CAChC;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAC9C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,mBAAmB,CAAO;IAElC,OAAO,CACN,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GACjB,gBAAgB;IAkBnB,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,mBAAmB;IAa3B,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAQ5C,iBAAiB,IAAI,OAAO;CAG5B"}
1
+ {"version":3,"file":"drift-corrector.d.ts","sourceRoot":"","sources":["../src/drift-corrector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,WAAW,IAAI,MAAM,CAAC;IAC1B,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;IAC/B,IAAI,YAAY,IAAI,MAAM,CAAC;IAC3B,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;CACjC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAC9C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,mBAAmB,CAAO;IAElC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,gBAAgB;IAkB7D,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,mBAAmB;IAgB3B,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAQ5C,iBAAiB,IAAI,OAAO;CAG7B"}
@@ -15,8 +15,8 @@ class DriftCorrector {
15
15
  if (absDrift < this.softCorrectionThreshold) {
16
16
  return {
17
17
  applied: false,
18
- method: 'ignore',
19
- adjustment: 0
18
+ method: "ignore",
19
+ adjustment: 0,
20
20
  };
21
21
  }
22
22
  if (absDrift < this.hardCorrectionThreshold) {
@@ -28,8 +28,8 @@ class DriftCorrector {
28
28
  if (this.isCorrecting) {
29
29
  return {
30
30
  applied: false,
31
- method: 'ignore',
32
- adjustment: 0
31
+ method: "ignore",
32
+ adjustment: 0,
33
33
  };
34
34
  }
35
35
  this.isCorrecting = true;
@@ -43,9 +43,9 @@ class DriftCorrector {
43
43
  }, 2000);
44
44
  return {
45
45
  applied: true,
46
- method: 'soft',
46
+ method: "soft",
47
47
  adjustment: drift,
48
- playbackRate: targetRate
48
+ playbackRate: targetRate,
49
49
  };
50
50
  }
51
51
  applyHardCorrection(drift, audio) {
@@ -54,8 +54,8 @@ class DriftCorrector {
54
54
  audio.currentTime = correctedPosition;
55
55
  return {
56
56
  applied: true,
57
- method: 'hard',
58
- adjustment: -drift
57
+ method: "hard",
58
+ adjustment: -drift,
59
59
  };
60
60
  }
61
61
  resetPlaybackRate(audio) {
@@ -1 +1 @@
1
- {"version":3,"file":"drift-corrector.js","sourceRoot":"","sources":["../src/drift-corrector.ts"],"names":[],"mappings":";;;AAcA,MAAa,cAAc;IAA3B;QACkB,4BAAuB,GAAG,EAAE,CAAC;QAC7B,4BAAuB,GAAG,GAAG,CAAC;QAC9B,aAAQ,GAAG,IAAI,CAAC;QAChB,aAAQ,GAAG,IAAI,CAAC;QAEzB,iBAAY,GAAG,KAAK,CAAC;QACrB,wBAAmB,GAAG,GAAG,CAAC;IA4EnC,CAAC;IA1EA,OAAO,CACN,KAAa,EACb,KAAmB;QAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7C,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,CAAC;aACb,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,mBAAmB,CAAC,KAAa,EAAE,KAAmB;QAC7D,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,CAAC;aACb,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAE7D,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAEtC,UAAU,CAAC,GAAG,EAAE;YACf,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;YACzB,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO;YACN,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,UAAU;SACxB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAa,EAAE,KAAmB;QAC7D,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1C,MAAM,iBAAiB,GAAG,eAAe,GAAG,KAAK,CAAC;QAElD,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAC;QAEtC,OAAO;YACN,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,CAAC,KAAK;SAClB,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,KAAmB;QACpC,IAAI,IAAI,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YACtC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;YACzB,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,CAAC;IACF,CAAC;IAED,iBAAiB;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;CACD;AAnFD,wCAmFC"}
1
+ {"version":3,"file":"drift-corrector.js","sourceRoot":"","sources":["../src/drift-corrector.ts"],"names":[],"mappings":";;;AAcA,MAAa,cAAc;IAA3B;QACmB,4BAAuB,GAAG,EAAE,CAAC;QAC7B,4BAAuB,GAAG,GAAG,CAAC;QAC9B,aAAQ,GAAG,IAAI,CAAC;QAChB,aAAQ,GAAG,IAAI,CAAC;QAEzB,iBAAY,GAAG,KAAK,CAAC;QACrB,wBAAmB,GAAG,GAAG,CAAC;IA+EpC,CAAC;IA7EC,OAAO,CAAC,KAAa,EAAE,KAAmB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAEO,mBAAmB,CACzB,KAAa,EACb,KAAmB;QAEnB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAE7D,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAEtC,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;YACzB,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;IAEO,mBAAmB,CACzB,KAAa,EACb,KAAmB;QAEnB,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1C,MAAM,iBAAiB,GAAG,eAAe,GAAG,KAAK,CAAC;QAElD,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAC;QAEtC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,CAAC,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,KAAmB;QACnC,IAAI,IAAI,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YACrC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;YACzB,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AAtFD,wCAsFC"}
@@ -15,6 +15,6 @@ export declare class DriftDetector {
15
15
  syncedNow: () => number;
16
16
  });
17
17
  calculateDrift(serverState: ServerState, actualPosition: number): DriftResult;
18
- getDriftSeverity(drift: number): 'ignore' | 'soft' | 'hard';
18
+ getDriftSeverity(drift: number): "ignore" | "soft" | "hard";
19
19
  }
20
20
  //# sourceMappingURL=drift-detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../src/drift-detector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,aAAa;IACb,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE;QAAE,SAAS,EAAE,MAAM,MAAM,CAAA;KAAE;IAEnE,cAAc,CACb,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM,GACpB,WAAW;IAiBd,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM;CAa3D"}
1
+ {"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../src/drift-detector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE;QAAE,SAAS,EAAE,MAAM,MAAM,CAAA;KAAE;IAEnE,cAAc,CACZ,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM,GACrB,WAAW;IAiBd,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM;CAa5D"}
@@ -16,18 +16,18 @@ class DriftDetector {
16
16
  drift,
17
17
  expectedPosition,
18
18
  actualPosition,
19
- timestamp: syncedNow
19
+ timestamp: syncedNow,
20
20
  };
21
21
  }
22
22
  getDriftSeverity(drift) {
23
23
  const absDrift = Math.abs(drift);
24
24
  if (absDrift < 50) {
25
- return 'ignore';
25
+ return "ignore";
26
26
  }
27
27
  if (absDrift < 300) {
28
- return 'soft';
28
+ return "soft";
29
29
  }
30
- return 'hard';
30
+ return "hard";
31
31
  }
32
32
  }
33
33
  exports.DriftDetector = DriftDetector;
@@ -1 +1 @@
1
- {"version":3,"file":"drift-detector.js","sourceRoot":"","sources":["../src/drift-detector.ts"],"names":[],"mappings":";;;AAaA,MAAa,aAAa;IACzB,YAA6B,SAAsC;QAAtC,cAAS,GAAT,SAAS,CAA6B;IAAG,CAAC;IAEvE,cAAc,CACb,WAAwB,EACxB,cAAsB;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAClD,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS;YAC7C,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,OAAO;YAClC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;QAE1B,MAAM,KAAK,GAAG,cAAc,GAAG,gBAAgB,CAAC;QAEhD,OAAO;YACN,KAAK;YACL,gBAAgB;YAChB,cAAc;YACd,SAAS,EAAE,SAAS;SACpB,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QACf,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AApCD,sCAoCC"}
1
+ {"version":3,"file":"drift-detector.js","sourceRoot":"","sources":["../src/drift-detector.ts"],"names":[],"mappings":";;;AAaA,MAAa,aAAa;IACxB,YAA6B,SAAsC;QAAtC,cAAS,GAAT,SAAS,CAA6B;IAAG,CAAC;IAEvE,cAAc,CACZ,WAAwB,EACxB,cAAsB;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAClD,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS;YAC5C,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,OAAO;YAClC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;QAE3B,MAAM,KAAK,GAAG,cAAc,GAAG,gBAAgB,CAAC;QAEhD,OAAO;YACL,KAAK;YACL,gBAAgB;YAChB,cAAc;YACd,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AApCD,sCAoCC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- export { ClockSync, type ClockSyncResult, type PingPongMessage } from './clock-sync';
2
- export { AudioClock } from './audio-clock';
3
- export { DriftDetector, type DriftResult, type ServerState } from './drift-detector';
4
- export { DriftCorrector, type CorrectionResult, type AudioElement } from './drift-corrector';
5
- export { PlayerStateSync, type PlayerState, type TrackMetadata } from './player-state-sync';
6
- export { PeriodicSync, type SyncConfig } from './periodic-sync';
7
- export { SynchronizedStart, type StartSchedule } from './synchronized-start';
8
- export { BufferManager, type BufferConfig } from './buffer-manager';
9
- export { AudioSyncEngine, type AudioSyncEngineConfig } from './audio-sync-engine';
1
+ export { ClockSync, type ClockSyncResult, type PingPongMessage, } from "./clock-sync";
2
+ export { AudioClock } from "./audio-clock";
3
+ export { DriftDetector, type DriftResult, type ServerState, } from "./drift-detector";
4
+ export { DriftCorrector, type CorrectionResult, type AudioElement, } from "./drift-corrector";
5
+ export { PlayerStateSync, type PlayerStateSyncAudioAdapter, type PlayerStateSyncConfig, type PlayerState, type TrackMetadata, } from "./player-state-sync";
6
+ export { getPlayerStateVersion, isSamePlayerSnapshot, isPlayerStateActiveForDevice, shouldApplyActiveDeviceChange, reduceIncomingPlayerUpdate, type PlayerUpdateRejectReason, type ReducePlayerUpdateResult, } from "./playback-state-reducer";
7
+ export { PeriodicSync, type SyncConfig } from "./periodic-sync";
8
+ export { SynchronizedStart, type StartSchedule } from "./synchronized-start";
9
+ export { BufferManager, type BufferConfig } from "./buffer-manager";
10
+ export { AudioSyncEngine, type AudioSyncEngineConfig, } from "./audio-sync-engine";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AudioSyncEngine = exports.BufferManager = exports.SynchronizedStart = exports.PeriodicSync = exports.PlayerStateSync = exports.DriftCorrector = exports.DriftDetector = exports.AudioClock = exports.ClockSync = void 0;
3
+ exports.AudioSyncEngine = exports.BufferManager = exports.SynchronizedStart = exports.PeriodicSync = exports.reduceIncomingPlayerUpdate = exports.shouldApplyActiveDeviceChange = exports.isPlayerStateActiveForDevice = exports.isSamePlayerSnapshot = exports.getPlayerStateVersion = exports.PlayerStateSync = exports.DriftCorrector = exports.DriftDetector = exports.AudioClock = exports.ClockSync = void 0;
4
4
  var clock_sync_1 = require("./clock-sync");
5
5
  Object.defineProperty(exports, "ClockSync", { enumerable: true, get: function () { return clock_sync_1.ClockSync; } });
6
6
  var audio_clock_1 = require("./audio-clock");
@@ -11,6 +11,12 @@ var drift_corrector_1 = require("./drift-corrector");
11
11
  Object.defineProperty(exports, "DriftCorrector", { enumerable: true, get: function () { return drift_corrector_1.DriftCorrector; } });
12
12
  var player_state_sync_1 = require("./player-state-sync");
13
13
  Object.defineProperty(exports, "PlayerStateSync", { enumerable: true, get: function () { return player_state_sync_1.PlayerStateSync; } });
14
+ var playback_state_reducer_1 = require("./playback-state-reducer");
15
+ Object.defineProperty(exports, "getPlayerStateVersion", { enumerable: true, get: function () { return playback_state_reducer_1.getPlayerStateVersion; } });
16
+ Object.defineProperty(exports, "isSamePlayerSnapshot", { enumerable: true, get: function () { return playback_state_reducer_1.isSamePlayerSnapshot; } });
17
+ Object.defineProperty(exports, "isPlayerStateActiveForDevice", { enumerable: true, get: function () { return playback_state_reducer_1.isPlayerStateActiveForDevice; } });
18
+ Object.defineProperty(exports, "shouldApplyActiveDeviceChange", { enumerable: true, get: function () { return playback_state_reducer_1.shouldApplyActiveDeviceChange; } });
19
+ Object.defineProperty(exports, "reduceIncomingPlayerUpdate", { enumerable: true, get: function () { return playback_state_reducer_1.reduceIncomingPlayerUpdate; } });
14
20
  var periodic_sync_1 = require("./periodic-sync");
15
21
  Object.defineProperty(exports, "PeriodicSync", { enumerable: true, get: function () { return periodic_sync_1.PeriodicSync; } });
16
22
  var synchronized_start_1 = require("./synchronized-start");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAAqF;AAA5E,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAAqF;AAA5E,+GAAA,aAAa,OAAA;AACtB,qDAA6F;AAApF,iHAAA,cAAc,OAAA;AACvB,yDAA4F;AAAnF,oHAAA,eAAe,OAAA;AACxB,iDAAgE;AAAvD,6GAAA,YAAY,OAAA;AACrB,2DAA6E;AAApE,uHAAA,iBAAiB,OAAA;AAC1B,mDAAoE;AAA3D,+GAAA,aAAa,OAAA;AACtB,yDAAkF;AAAzE,oHAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAIsB;AAHpB,uGAAA,SAAS,OAAA;AAIX,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAI0B;AAHxB,+GAAA,aAAa,OAAA;AAIf,qDAI2B;AAHzB,iHAAA,cAAc,OAAA;AAIhB,yDAM6B;AAL3B,oHAAA,eAAe,OAAA;AAMjB,mEAQkC;AAPhC,+HAAA,qBAAqB,OAAA;AACrB,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,uIAAA,6BAA6B,OAAA;AAC7B,oIAAA,0BAA0B,OAAA;AAI5B,iDAAgE;AAAvD,6GAAA,YAAY,OAAA;AACrB,2DAA6E;AAApE,uHAAA,iBAAiB,OAAA;AAC1B,mDAAoE;AAA3D,+GAAA,aAAa,OAAA;AACtB,yDAG6B;AAF3B,oHAAA,eAAe,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"periodic-sync.d.ts","sourceRoot":"","sources":["../src/periodic-sync.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAY;IAKvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAGR,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,IAAI;IAGpC,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAQZ,SAAS,IAAI,OAAO;IAIpB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;CAS/C"}
1
+ {"version":3,"file":"periodic-sync.d.ts","sourceRoot":"","sources":["../src/periodic-sync.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAGP,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,IAAI;IAGrC,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAQZ,SAAS,IAAI,OAAO;IAIpB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;CAShD"}
@@ -1 +1 @@
1
- {"version":3,"file":"periodic-sync.js","sourceRoot":"","sources":["../src/periodic-sync.ts"],"names":[],"mappings":";;;AAKA,MAAa,YAAY;IAIxB,YACkB,MAAkB,EAClB,MAAkB;QADlB,WAAM,GAAN,MAAM,CAAY;QAClB,WAAM,GAAN,MAAM,CAAY;QAL5B,eAAU,GAAkB,IAAI,CAAC;QACjC,cAAS,GAAG,KAAK,CAAC;IAKvB,CAAC;IAEJ,KAAK;QACJ,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO;QACR,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI;QACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,YAAY,CAAC,MAA2B;QACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACF,CAAC;CACD;AAzCD,oCAyCC"}
1
+ {"version":3,"file":"periodic-sync.js","sourceRoot":"","sources":["../src/periodic-sync.ts"],"names":[],"mappings":";;;AAKA,MAAa,YAAY;IAIvB,YACmB,MAAkB,EAClB,MAAkB;QADlB,WAAM,GAAN,MAAM,CAAY;QAClB,WAAM,GAAN,MAAM,CAAY;QAL7B,eAAU,GAAkB,IAAI,CAAC;QACjC,cAAS,GAAG,KAAK,CAAC;IAKvB,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,MAA2B;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAzCD,oCAyCC"}
@@ -0,0 +1,17 @@
1
+ import type { PlayerState } from "./player-state-sync";
2
+ export type PlayerUpdateRejectReason = "stale_version" | "duplicate_snapshot" | "same_version_older_position";
3
+ export type ReducePlayerUpdateResult = {
4
+ shouldApply: true;
5
+ state: PlayerState;
6
+ version: number;
7
+ } | {
8
+ shouldApply: false;
9
+ reason: PlayerUpdateRejectReason;
10
+ version: number;
11
+ };
12
+ export declare function getPlayerStateVersion(state: PlayerState | null): number;
13
+ export declare function isSamePlayerSnapshot(left: PlayerState, right: PlayerState): boolean;
14
+ export declare function isPlayerStateActiveForDevice(state: PlayerState, deviceId: string | null): boolean;
15
+ export declare function shouldApplyActiveDeviceChange(currentActiveDeviceId: string | null, incomingDeviceId: string): boolean;
16
+ export declare function reduceIncomingPlayerUpdate(incomingState: PlayerState, currentState: PlayerState | null, lastEventSeq: number): ReducePlayerUpdateResult;
17
+ //# sourceMappingURL=playback-state-reducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playback-state-reducer.d.ts","sourceRoot":"","sources":["../src/playback-state-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAChC,eAAe,GACf,oBAAoB,GACpB,6BAA6B,CAAC;AAElC,MAAM,MAAM,wBAAwB,GAChC;IACE,WAAW,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,WAAW,EAAE,KAAK,CAAC;IACnB,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAMvE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,WAAW,GACjB,OAAO,CAST;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAIT;AAED,wBAAgB,6BAA6B,CAC3C,qBAAqB,EAAE,MAAM,GAAG,IAAI,EACpC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAET;AAED,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,WAAW,EAC1B,YAAY,EAAE,WAAW,GAAG,IAAI,EAChC,YAAY,EAAE,MAAM,GACnB,wBAAwB,CAwC1B"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPlayerStateVersion = getPlayerStateVersion;
4
+ exports.isSamePlayerSnapshot = isSamePlayerSnapshot;
5
+ exports.isPlayerStateActiveForDevice = isPlayerStateActiveForDevice;
6
+ exports.shouldApplyActiveDeviceChange = shouldApplyActiveDeviceChange;
7
+ exports.reduceIncomingPlayerUpdate = reduceIncomingPlayerUpdate;
8
+ function getPlayerStateVersion(state) {
9
+ if (!state) {
10
+ return 0;
11
+ }
12
+ return Math.max(state.updatedAt ?? 0, state.lastServerSyncAt ?? 0);
13
+ }
14
+ function isSamePlayerSnapshot(left, right) {
15
+ return (left.trackId === right.trackId &&
16
+ left.isPlaying === right.isPlaying &&
17
+ left.positionMs === right.positionMs &&
18
+ left.activeDeviceId === right.activeDeviceId &&
19
+ left.updatedAt === right.updatedAt &&
20
+ left.lastServerSyncAt === right.lastServerSyncAt);
21
+ }
22
+ function isPlayerStateActiveForDevice(state, deviceId) {
23
+ return Boolean(deviceId && state.activeDeviceId && state.activeDeviceId === deviceId);
24
+ }
25
+ function shouldApplyActiveDeviceChange(currentActiveDeviceId, incomingDeviceId) {
26
+ return currentActiveDeviceId !== incomingDeviceId;
27
+ }
28
+ function reduceIncomingPlayerUpdate(incomingState, currentState, lastEventSeq) {
29
+ const incomingVersion = getPlayerStateVersion(incomingState);
30
+ const currentVersion = getPlayerStateVersion(currentState);
31
+ if (incomingVersion < lastEventSeq || incomingVersion < currentVersion) {
32
+ return {
33
+ shouldApply: false,
34
+ reason: "stale_version",
35
+ version: incomingVersion,
36
+ };
37
+ }
38
+ if (currentState && isSamePlayerSnapshot(incomingState, currentState)) {
39
+ return {
40
+ shouldApply: false,
41
+ reason: "duplicate_snapshot",
42
+ version: incomingVersion,
43
+ };
44
+ }
45
+ if (currentState &&
46
+ incomingVersion === currentVersion &&
47
+ incomingState.trackId === currentState.trackId &&
48
+ incomingState.activeDeviceId === currentState.activeDeviceId &&
49
+ incomingState.isPlaying === currentState.isPlaying &&
50
+ incomingState.positionMs < currentState.positionMs) {
51
+ return {
52
+ shouldApply: false,
53
+ reason: "same_version_older_position",
54
+ version: incomingVersion,
55
+ };
56
+ }
57
+ return {
58
+ shouldApply: true,
59
+ state: incomingState,
60
+ version: incomingVersion,
61
+ };
62
+ }
63
+ //# sourceMappingURL=playback-state-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playback-state-reducer.js","sourceRoot":"","sources":["../src/playback-state-reducer.ts"],"names":[],"mappings":";;AAmBA,sDAMC;AAED,oDAYC;AAED,oEAOC;AAED,sEAKC;AAED,gEA4CC;AAlFD,SAAgB,qBAAqB,CAAC,KAAyB;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,oBAAoB,CAClC,IAAiB,EACjB,KAAkB;IAElB,OAAO,CACL,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAClC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;QACpC,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc;QAC5C,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAClC,IAAI,CAAC,gBAAgB,KAAK,KAAK,CAAC,gBAAgB,CACjD,CAAC;AACJ,CAAC;AAED,SAAgB,4BAA4B,CAC1C,KAAkB,EAClB,QAAuB;IAEvB,OAAO,OAAO,CACZ,QAAQ,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,CACtE,CAAC;AACJ,CAAC;AAED,SAAgB,6BAA6B,CAC3C,qBAAoC,EACpC,gBAAwB;IAExB,OAAO,qBAAqB,KAAK,gBAAgB,CAAC;AACpD,CAAC;AAED,SAAgB,0BAA0B,CACxC,aAA0B,EAC1B,YAAgC,EAChC,YAAoB;IAEpB,MAAM,eAAe,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAE3D,IAAI,eAAe,GAAG,YAAY,IAAI,eAAe,GAAG,cAAc,EAAE,CAAC;QACvE,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,eAAe;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,IAAI,oBAAoB,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;QACtE,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,eAAe;SACzB,CAAC;IACJ,CAAC;IAED,IACE,YAAY;QACZ,eAAe,KAAK,cAAc;QAClC,aAAa,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO;QAC9C,aAAa,CAAC,cAAc,KAAK,YAAY,CAAC,cAAc;QAC5D,aAAa,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS;QAClD,aAAa,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,EAClD,CAAC;QACD,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,6BAA6B;YACrC,OAAO,EAAE,eAAe;SACzB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,eAAe;KACzB,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type ReducePlayerUpdateResult } from "./playback-state-reducer";
1
2
  export interface PlayerState {
2
3
  userId: string;
3
4
  activeDeviceId: string | null;
@@ -13,23 +14,38 @@ export interface TrackMetadata {
13
14
  id: string;
14
15
  streamUrl: string;
15
16
  duration: number;
16
- source: 's3' | 'cdn' | 'proxy';
17
+ source: "s3" | "cdn" | "proxy";
18
+ }
19
+ export interface PlayerStateSyncAudioAdapter {
20
+ currentTime: number;
21
+ src: string;
22
+ play: () => void | Promise<void>;
23
+ pause: () => void;
24
+ setCurrentTime: (value: number) => void;
25
+ }
26
+ export interface PlayerStateSyncConfig {
27
+ deviceId?: string | null;
28
+ seekDriftThresholdSeconds?: number;
29
+ activationDriftThresholdSeconds?: number;
17
30
  }
18
31
  export declare class PlayerStateSync {
19
32
  private currentTrackId;
20
33
  private currentStreamUrl;
21
34
  private lastState;
22
- handlePlayerUpdate(state: PlayerState, audio: {
23
- currentTime: number;
24
- src: string;
25
- play: () => void;
26
- pause: () => void;
27
- setCurrentTime: (value: number) => void;
28
- }, loadTrack: (trackId: string) => Promise<TrackMetadata>): void;
35
+ private readonly deviceId;
36
+ private readonly seekDriftThresholdSeconds;
37
+ private readonly activationDriftThresholdSeconds;
38
+ private lastPlaybackIntent;
39
+ private lastAppliedStateVersion;
40
+ constructor(config?: PlayerStateSyncConfig);
41
+ handlePlayerUpdate(state: PlayerState, audio: PlayerStateSyncAudioAdapter, loadTrack: (trackId: string) => Promise<TrackMetadata>, lastEventSeq?: number): ReducePlayerUpdateResult;
29
42
  private loadNewTrack;
30
43
  private syncPosition;
44
+ private pauseIfNeeded;
45
+ private playIfNeeded;
31
46
  getCurrentTrackId(): string | null;
32
47
  getCurrentStreamUrl(): string | null;
33
48
  getLastState(): PlayerState | null;
49
+ getLastAppliedStateVersion(): number;
34
50
  }
35
51
  //# sourceMappingURL=player-state-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"player-state-sync.d.ts","sourceRoot":"","sources":["../src/player-state-sync.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC;CAC/B;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAA4B;IAE7C,kBAAkB,CACjB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,EACzH,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GACpD,IAAI;YAgBO,YAAY;IAgB1B,OAAO,CAAC,YAAY;IAgBpB,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC,YAAY,IAAI,WAAW,GAAG,IAAI;CAGlC"}
1
+ {"version":3,"file":"player-state-sync.d.ts","sourceRoot":"","sources":["../src/player-state-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,+BAA+B,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAS;IACzD,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,uBAAuB,CAAK;gBAExB,MAAM,GAAE,qBAA0B;IAO9C,kBAAkB,CAChB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,2BAA2B,EAClC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,EACtD,YAAY,GAAE,MAAU,GACvB,wBAAwB;YAmDb,YAAY;IAgB1B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,aAAa;YASP,YAAY;IAW1B,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC,YAAY,IAAI,WAAW,GAAG,IAAI;IAIlC,0BAA0B,IAAI,MAAM;CAGrC"}
@@ -1,24 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PlayerStateSync = void 0;
4
+ const playback_state_reducer_1 = require("./playback-state-reducer");
4
5
  class PlayerStateSync {
5
- constructor() {
6
+ constructor(config = {}) {
6
7
  this.currentTrackId = null;
7
8
  this.currentStreamUrl = null;
8
9
  this.lastState = null;
10
+ this.lastPlaybackIntent = null;
11
+ this.lastAppliedStateVersion = 0;
12
+ this.deviceId = config.deviceId ?? null;
13
+ this.seekDriftThresholdSeconds = config.seekDriftThresholdSeconds ?? 0.35;
14
+ this.activationDriftThresholdSeconds =
15
+ config.activationDriftThresholdSeconds ?? 0.2;
9
16
  }
10
- handlePlayerUpdate(state, audio, loadTrack) {
11
- this.lastState = state;
12
- if (state.trackId !== this.currentTrackId && state.trackId) {
13
- this.loadNewTrack(state.trackId, audio, loadTrack);
17
+ handlePlayerUpdate(state, audio, loadTrack, lastEventSeq = 0) {
18
+ const reduceResult = (0, playback_state_reducer_1.reduceIncomingPlayerUpdate)(state, this.lastState, lastEventSeq);
19
+ if (!reduceResult.shouldApply) {
20
+ return reduceResult;
14
21
  }
15
- if (state.isPlaying) {
16
- audio.play();
22
+ const nextState = reduceResult.state;
23
+ const stateVersion = (0, playback_state_reducer_1.getPlayerStateVersion)(nextState);
24
+ if (stateVersion < this.lastAppliedStateVersion) {
25
+ return {
26
+ shouldApply: false,
27
+ reason: "stale_version",
28
+ version: stateVersion,
29
+ };
30
+ }
31
+ this.lastAppliedStateVersion = stateVersion;
32
+ this.lastState = nextState;
33
+ const isActiveDevice = (0, playback_state_reducer_1.isPlayerStateActiveForDevice)(nextState, this.deviceId);
34
+ if (!isActiveDevice) {
35
+ this.pauseIfNeeded(audio);
36
+ return reduceResult;
37
+ }
38
+ if (nextState.trackId !== this.currentTrackId && nextState.trackId) {
39
+ void this.loadNewTrack(nextState.trackId, audio, loadTrack);
40
+ }
41
+ this.syncPosition(nextState.positionMs, nextState.updatedAt, nextState.isPlaying, audio);
42
+ if (nextState.isPlaying) {
43
+ void this.playIfNeeded(audio);
17
44
  }
18
45
  else {
19
- audio.pause();
46
+ this.pauseIfNeeded(audio);
20
47
  }
21
- this.syncPosition(state.positionMs, state.updatedAt, state.isPlaying, audio);
48
+ return reduceResult;
22
49
  }
23
50
  async loadNewTrack(trackId, audio, loadTrack) {
24
51
  try {
@@ -29,17 +56,39 @@ class PlayerStateSync {
29
56
  audio.currentTime = 0;
30
57
  }
31
58
  catch (error) {
32
- console.error('Failed to load track:', error);
59
+ console.error("Failed to load track:", error);
33
60
  }
34
61
  }
35
62
  syncPosition(serverPosition, serverUpdatedAt, isPlaying, audio) {
36
63
  if (!isPlaying) {
37
- audio.setCurrentTime(serverPosition / 1000);
64
+ const pausedSeconds = serverPosition / 1000;
65
+ const pausedDrift = Math.abs(audio.currentTime - pausedSeconds);
66
+ if (pausedDrift > this.activationDriftThresholdSeconds) {
67
+ audio.setCurrentTime(pausedSeconds);
68
+ }
38
69
  return;
39
70
  }
40
71
  const elapsed = Date.now() - serverUpdatedAt;
41
72
  const expectedPosition = serverPosition + elapsed;
42
- audio.setCurrentTime(expectedPosition / 1000);
73
+ const expectedSeconds = expectedPosition / 1000;
74
+ const driftSeconds = Math.abs(audio.currentTime - expectedSeconds);
75
+ if (driftSeconds > this.seekDriftThresholdSeconds) {
76
+ audio.setCurrentTime(expectedSeconds);
77
+ }
78
+ }
79
+ pauseIfNeeded(audio) {
80
+ if (this.lastPlaybackIntent === "pause") {
81
+ return;
82
+ }
83
+ audio.pause();
84
+ this.lastPlaybackIntent = "pause";
85
+ }
86
+ async playIfNeeded(audio) {
87
+ if (this.lastPlaybackIntent === "play") {
88
+ return;
89
+ }
90
+ await Promise.resolve(audio.play());
91
+ this.lastPlaybackIntent = "play";
43
92
  }
44
93
  getCurrentTrackId() {
45
94
  return this.currentTrackId;
@@ -50,6 +99,9 @@ class PlayerStateSync {
50
99
  getLastState() {
51
100
  return this.lastState;
52
101
  }
102
+ getLastAppliedStateVersion() {
103
+ return this.lastAppliedStateVersion;
104
+ }
53
105
  }
54
106
  exports.PlayerStateSync = PlayerStateSync;
55
107
  //# sourceMappingURL=player-state-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"player-state-sync.js","sourceRoot":"","sources":["../src/player-state-sync.ts"],"names":[],"mappings":";;;AAmBA,MAAa,eAAe;IAA5B;QACS,mBAAc,GAAkB,IAAI,CAAC;QACrC,qBAAgB,GAAkB,IAAI,CAAC;QACvC,cAAS,GAAuB,IAAI,CAAC;IAiE9C,CAAC;IA/DA,kBAAkB,CACjB,KAAkB,EAClB,KAAyH,EACzH,SAAsD;QAEtD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAEO,KAAK,CAAC,YAAY,CACzB,OAAe,EACf,KAA2C,EAC3C,SAAsD;QAEtD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC3C,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC/B,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IAEO,YAAY,CACnB,cAAsB,EACtB,eAAuB,EACvB,SAAkB,EAClB,KAAuE;QAEvE,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,KAAK,CAAC,cAAc,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;YAC5C,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;QAC7C,MAAM,gBAAgB,GAAG,cAAc,GAAG,OAAO,CAAC;QAClD,KAAK,CAAC,cAAc,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,iBAAiB;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,mBAAmB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC9B,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;CACD;AApED,0CAoEC"}
1
+ {"version":3,"file":"player-state-sync.js","sourceRoot":"","sources":["../src/player-state-sync.ts"],"names":[],"mappings":";;;AAAA,qEAKkC;AAmClC,MAAa,eAAe;IAU1B,YAAY,SAAgC,EAAE;QATtC,mBAAc,GAAkB,IAAI,CAAC;QACrC,qBAAgB,GAAkB,IAAI,CAAC;QACvC,cAAS,GAAuB,IAAI,CAAC;QAIrC,uBAAkB,GAA4B,IAAI,CAAC;QACnD,4BAAuB,GAAG,CAAC,CAAC;QAGlC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,yBAAyB,IAAI,IAAI,CAAC;QAC1E,IAAI,CAAC,+BAA+B;YAClC,MAAM,CAAC,+BAA+B,IAAI,GAAG,CAAC;IAClD,CAAC;IAED,kBAAkB,CAChB,KAAkB,EAClB,KAAkC,EAClC,SAAsD,EACtD,eAAuB,CAAC;QAExB,MAAM,YAAY,GAAG,IAAA,mDAA0B,EAC7C,KAAK,EACL,IAAI,CAAC,SAAS,EACd,YAAY,CACb,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;QACrC,MAAM,YAAY,GAAG,IAAA,8CAAqB,EAAC,SAAS,CAAC,CAAC;QACtD,IAAI,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAChD,OAAO;gBACL,WAAW,EAAE,KAAK;gBAClB,MAAM,EAAE,eAAe;gBACvB,OAAO,EAAE,YAAY;aACtB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,uBAAuB,GAAG,YAAY,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,MAAM,cAAc,GAAG,IAAA,qDAA4B,EAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACnE,KAAK,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,YAAY,CACf,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,SAAS,EACnB,KAAK,CACN,CAAC;QAEF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,OAAe,EACf,KAA2C,EAC3C,SAAsD;QAEtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC3C,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC/B,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,YAAY,CAClB,cAAsB,EACtB,eAAuB,EACvB,SAAkB,EAClB,KAAuE;QAEvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,cAAc,GAAG,IAAI,CAAC;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;YAChE,IAAI,WAAW,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBACvD,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;QAC7C,MAAM,gBAAgB,GAAG,cAAc,GAAG,OAAO,CAAC;QAClD,MAAM,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC;QACnE,IAAI,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAClD,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAA4B;QAChD,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAE1B;QACC,IAAI,IAAI,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;IACnC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,0BAA0B;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;CACF;AApJD,0CAoJC"}
@@ -1 +1 @@
1
- {"version":3,"file":"synchronized-start.d.ts","sourceRoot":"","sources":["../src/synchronized-start.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,iBAAiB;IAC7B,aAAa,CACZ,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,MAAM,EACvB,OAAO,EAAE,MAAM,IAAI,GACjB,aAAa;IAchB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,MAAM;CAItE"}
1
+ {"version":3,"file":"synchronized-start.d.ts","sourceRoot":"","sources":["../src/synchronized-start.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB;IAC5B,aAAa,CACX,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,MAAM,EACvB,OAAO,EAAE,MAAM,IAAI,GAClB,aAAa;IAchB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,MAAM;CAIvE"}
@@ -10,7 +10,7 @@ class SynchronizedStart {
10
10
  }, delay);
11
11
  return {
12
12
  startAt: serverStartAt,
13
- delay
13
+ delay,
14
14
  };
15
15
  }
16
16
  cancelStart(timeoutId) {
@@ -1 +1 @@
1
- {"version":3,"file":"synchronized-start.js","sourceRoot":"","sources":["../src/synchronized-start.ts"],"names":[],"mappings":";;;AAKA,MAAa,iBAAiB;IAC7B,aAAa,CACZ,aAAqB,EACrB,SAAuB,EACvB,OAAmB;QAEnB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;QAE/C,UAAU,CAAC,GAAG,EAAE;YACf,OAAO,EAAE,CAAC;QACX,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO;YACN,OAAO,EAAE,aAAa;YACtB,KAAK;SACL,CAAC;IACH,CAAC;IAED,WAAW,CAAC,SAAiB;QAC5B,YAAY,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,SAAuB;QAC5D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;IACzC,CAAC;CACD;AA3BD,8CA2BC"}
1
+ {"version":3,"file":"synchronized-start.js","sourceRoot":"","sources":["../src/synchronized-start.ts"],"names":[],"mappings":";;;AAKA,MAAa,iBAAiB;IAC5B,aAAa,CACX,aAAqB,EACrB,SAAuB,EACvB,OAAmB;QAEnB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;QAE/C,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO;YACL,OAAO,EAAE,aAAa;YACtB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,SAAuB;QAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF;AA3BD,8CA2BC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@axsnull/audio-sync-engine",
3
- "version": "1.0.3",
4
- "description": "Production-grade client-side audio synchronization engine for distributed playback systems",
3
+ "version": "1.2.0",
4
+ "description": "Prod-grade client-side audio synchronization engine for distributed playback systems",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [