@nomercy-entertainment/nomercy-player-core 2.2.3 → 2.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.2.5] — 2026-10-08
6
+
7
+ ### Changed
8
+
9
+ - Version alignment with the trio; no code change.
10
+
11
+ ## [2.2.4] — 2026-10-08
12
+
13
+ ### Fixed
14
+
15
+ - The volume memory plugin now saves the volume you chose, not the 0 it reads while muted. A saved muted level of 0 no longer makes the player silent after a reload.
16
+
5
17
  ## [2.2.3] — 2026-09-25
6
18
 
7
19
  ### Fixed
@@ -10,4 +10,4 @@
10
10
  * Semver string for the currently running kit build.
11
11
  * Inlined at build time from package.json — no runtime JSON import needed.
12
12
  */
13
- export const KIT_VERSION = "2.2.3";
13
+ export const KIT_VERSION = "2.2.5";
@@ -32,10 +32,18 @@ export declare class VolumeMemoryPlugin<P extends IPlayer<BaseEventMap> = IPlaye
32
32
  static readonly description: string;
33
33
  private _unsubscribeVolume;
34
34
  private _unsubscribeMute;
35
+ /**
36
+ * The level the listener chose, on the 0-100 scale. `player.volume()` reads
37
+ * 0 while muted, so the plugin tracks the level from `volume` events and
38
+ * never saves the muted reading.
39
+ */
40
+ private _level;
35
41
  /** Restores persisted volume/mute state and subscribes to future changes. */
36
42
  use(): void;
37
43
  /** Unsubscribes from `volume` / `mute` events. */
38
44
  dispose(): void;
45
+ /** The live level, or the default when the player reads 0 only because it is muted. */
46
+ private _readLevel;
39
47
  private _save;
40
48
  private _loadPersisted;
41
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/volume-memory/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IACnC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,mBAAmB,EAAE,YAAY,CAAC;IAC9H,gBAAyB,EAAE,EAAE,MAAM,CAAmB;IACtD,gBAAyB,OAAO,EAAE,MAAM,CAAW;IACnD,gBAAyB,WAAW,EAAE,MAAM,CAA0E;IAEtH,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,gBAAgB,CAA6B;IAErD,6EAA6E;IACpE,GAAG,IAAI,IAAI;IAkBpB,kDAAkD;IACzC,OAAO,IAAI,IAAI;IAOxB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,cAAc;CAatB;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,2BAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/volume-memory/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IACnC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,mBAAmB,EAAE,YAAY,CAAC;IAC9H,gBAAyB,EAAE,EAAE,MAAM,CAAmB;IACtD,gBAAyB,OAAO,EAAE,MAAM,CAAW;IACnD,gBAAyB,WAAW,EAAE,MAAM,CAA0E;IAEtH,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,gBAAgB,CAA6B;IAErD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAe;IAE7B,6EAA6E;IACpE,GAAG,IAAI,IAAI;IA8BpB,kDAAkD;IACzC,OAAO,IAAI,IAAI;IAOxB,uFAAuF;IACvF,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,cAAc;CAatB;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,2BAAqB,CAAC"}
@@ -31,15 +31,32 @@ export class VolumeMemoryPlugin extends Plugin {
31
31
  static description = 'Persists volume + mute state across sessions via the storage adapter';
32
32
  _unsubscribeVolume = null;
33
33
  _unsubscribeMute = null;
34
+ /**
35
+ * The level the listener chose, on the 0-100 scale. `player.volume()` reads
36
+ * 0 while muted, so the plugin tracks the level from `volume` events and
37
+ * never saves the muted reading.
38
+ */
39
+ _level = 100;
34
40
  /** Restores persisted volume/mute state and subscribes to future changes. */
35
41
  use() {
36
42
  const key = this.opts?.persistKey ?? DEFAULT_PERSIST_KEY;
37
43
  const restored = this._loadPersisted(key);
38
- if (restored?.level !== undefined)
44
+ // `{ level: 0, muted: true }` is what earlier versions wrote on every mute:
45
+ // the level was the muted reading, not a choice. Restoring it left the
46
+ // player muted at a "level before mute" of 0, so unmute stayed silent.
47
+ const levelIsMutedReading = restored?.muted === true && restored.level === 0;
48
+ if (restored?.level !== undefined && !levelIsMutedReading)
39
49
  void this.player.volume(restored.level);
40
50
  if (restored?.muted)
41
51
  void this.player.mute();
42
- const onVolume = () => this._save(key);
52
+ this._level = restored?.level !== undefined && !levelIsMutedReading
53
+ ? restored.level
54
+ : this._readLevel();
55
+ const onVolume = (event) => {
56
+ if (typeof event?.level === 'number')
57
+ this._level = event.level;
58
+ this._save(key);
59
+ };
43
60
  const onMute = () => this._save(key);
44
61
  this.on('volume', onVolume);
45
62
  this.on('mute', onMute);
@@ -53,9 +70,13 @@ export class VolumeMemoryPlugin extends Plugin {
53
70
  this._unsubscribeVolume = null;
54
71
  this._unsubscribeMute = null;
55
72
  }
73
+ /** The live level, or the default when the player reads 0 only because it is muted. */
74
+ _readLevel() {
75
+ return this.player.volumeState() === VolumeState.MUTED ? 100 : this.player.volume();
76
+ }
56
77
  _save(key) {
57
78
  const state = {
58
- level: this.player.volume(),
79
+ level: this._level,
59
80
  muted: this.player.volumeState() === VolumeState.MUTED,
60
81
  };
61
82
  void this.storage?.setJSON?.(key, state);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/volume-memory/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,uCAAuC;AACvC,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,uCAAuC;AACvC,gFAAgF;AAGhF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAiB/C,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,kBAA8D,SAAQ,MAA4C;IAC9H,MAAM,CAAmB,EAAE,GAAW,eAAe,CAAC;IACtD,MAAM,CAAmB,OAAO,GAAW,OAAO,CAAC;IACnD,MAAM,CAAmB,WAAW,GAAW,sEAAsE,CAAC;IAE9G,kBAAkB,GAAwB,IAAI,CAAC;IAC/C,gBAAgB,GAAwB,IAAI,CAAC;IAErD,6EAA6E;IACpE,GAAG;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAE1C,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS;YAChC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,KAAK;YAClB,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzB,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE3C,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,kDAAkD;IACzC,OAAO;QACf,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,GAAW;QACxB,MAAM,KAAK,GAAyB;YACnC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC3B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,KAAK;SACtD,CAAC;QACF,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAEO,cAAc,CAAC,GAAW;QACjC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAuB,GAAG,CAAC,CAAC;YAC/D,qEAAqE;YACrE,sEAAsE;YACtE,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAK,GAAc,CAAC;gBAC1E,OAAO,GAA2B,CAAC;QACrC,CAAC;QACD,MAAM,CAAC;YACN,aAAa;QACd,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;;AAGF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/volume-memory/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nomercy-entertainment/nomercy-player-core",
3
3
  "type": "module",
4
- "version": "2.2.3",
4
+ "version": "2.2.5",
5
5
  "description": "NoMercy player core — shared spine for nomercy-music-player and nomercy-video-player. Plugin runtime, event system, lifecycle helpers, streams, cues, errors, auth.",
6
6
  "author": {
7
7
  "name": "NoMercy Entertainment",
@@ -231,13 +231,13 @@
231
231
  "@antfu/eslint-config": "^9.0.0",
232
232
  "@nomercy-entertainment/eslint-plugin-player": "^0.3.0",
233
233
  "@types/node": "^25.9.0",
234
- "@vitest/coverage-v8": "^4.1.9",
235
- "@vitest/ui": "^4.1.6",
234
+ "@vitest/coverage-v8": "^4.1.11",
235
+ "@vitest/ui": "^4.1.11",
236
236
  "eslint": "^10.4.0",
237
237
  "happy-dom": "^20.9.0",
238
238
  "tsc-alias": "^1.8.17",
239
239
  "typescript": "^6.0.3",
240
240
  "vite": "^8.0.13",
241
- "vitest": "^4.1.6"
241
+ "vitest": "^4.1.11"
242
242
  }
243
243
  }