@goldenratio/wolf 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,6 +6,7 @@
6
6
  - Written in TypeScript (better type safety)
7
7
  - Compatible with [Google Closure Compiler](https://github.com/google/closure-compiler)
8
8
  - ESM only
9
+ - Minor bug fixes
9
10
 
10
11
  ## Install
11
12
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@goldenratio/wolf",
3
- "version": "0.0.2",
4
- "description": "Port of howler.js in TypeScript (ESM)",
3
+ "version": "0.0.3",
4
+ "description": "Audio library for the modern web. Port of howler.js in TypeScript (ESM)",
5
5
  "type": "module",
6
6
  "module": "./target/wolf.js",
7
7
  "types": "./target/types/main.d.ts",
@@ -1,4 +1,4 @@
1
- import type { HowlEventHandler, HowlEventName, HowlListener, HowlOptions, HowlState, HowlXHR, HowlSpriteMap, WebAudioNodeWithSource } from "./types.js";
1
+ import type { HowlCallback, HowlEventName, HowlListener, HowlOptions, HowlState, HowlXHR, SoundSpriteDefinitions, WebAudioNodeWithSource } from "./types.js";
2
2
  import { Sound } from "./sound.js";
3
3
  export declare class Howl {
4
4
  private readonly howler;
@@ -10,7 +10,7 @@ export declare class Howl {
10
10
  _pool: number;
11
11
  _preload: boolean | "metadata" | "none";
12
12
  _rate: number;
13
- _sprite: HowlSpriteMap;
13
+ _sprite: SoundSpriteDefinitions;
14
14
  _src: readonly string[];
15
15
  _volume: number;
16
16
  _xhr: HowlXHR;
@@ -107,9 +107,9 @@ export declare class Howl {
107
107
  loop(loop: boolean): this;
108
108
  loop(loop: boolean, id: number): this;
109
109
  unload(): void;
110
- on(event: HowlEventName, fn: HowlEventHandler, id?: number, once?: boolean): this;
111
- off(event?: HowlEventName, fn?: HowlEventHandler | number, id?: number): this;
112
- once(event: HowlEventName, fn: HowlEventHandler, id?: number): this;
110
+ on(event: HowlEventName, fn: HowlCallback, id?: number, once?: boolean): this;
111
+ off(event?: HowlEventName, fn?: HowlCallback | number, id?: number): this;
112
+ once(event: HowlEventName, fn: HowlCallback, id?: number): this;
113
113
  /**
114
114
  * Starts the internal interval to fade a sound.
115
115
  */
@@ -1,10 +1,10 @@
1
1
  export type HowlState = "unloaded" | "loading" | "loaded";
2
2
  export type HowlerState = "suspended" | "suspending" | "running";
3
3
  export type HowlEventName = "end" | "fade" | "load" | "loaderror" | "playerror" | "pause" | "play" | "stop" | "mute" | "volume" | "rate" | "seek" | "unlock" | "resume";
4
- export type HowlEventHandler = (soundId?: number, errorMsg?: string) => void;
4
+ export type HowlCallback = (soundId?: number, errorMsg?: string) => void;
5
5
  export interface HowlListener {
6
6
  readonly id?: number;
7
- readonly fn: HowlEventHandler;
7
+ readonly fn: HowlCallback;
8
8
  readonly once?: boolean;
9
9
  }
10
10
  export interface HowlXHR {
@@ -13,7 +13,7 @@ export interface HowlXHR {
13
13
  readonly headers?: Record<string, string>;
14
14
  }
15
15
  export type HowlSpriteDef = [startMs: number, durationMs: number, loop?: boolean];
16
- export type HowlSpriteMap = Record<string, HowlSpriteDef>;
16
+ export type SoundSpriteDefinitions = Record<string, HowlSpriteDef>;
17
17
  export interface HowlOptions {
18
18
  readonly src: string | readonly string[];
19
19
  readonly autoplay?: boolean;
@@ -24,23 +24,23 @@ export interface HowlOptions {
24
24
  readonly pool?: number;
25
25
  readonly preload?: boolean | "metadata" | "none";
26
26
  readonly rate?: number;
27
- readonly sprite?: HowlSpriteMap;
27
+ readonly sprite?: SoundSpriteDefinitions;
28
28
  readonly volume?: number;
29
29
  readonly xhr?: Partial<HowlXHR>;
30
- readonly onend?: HowlEventHandler;
31
- readonly onfade?: HowlEventHandler;
32
- readonly onload?: HowlEventHandler;
33
- readonly onloaderror?: HowlEventHandler;
34
- readonly onplayerror?: HowlEventHandler;
35
- readonly onpause?: HowlEventHandler;
36
- readonly onplay?: HowlEventHandler;
37
- readonly onstop?: HowlEventHandler;
38
- readonly onmute?: HowlEventHandler;
39
- readonly onvolume?: HowlEventHandler;
40
- readonly onrate?: HowlEventHandler;
41
- readonly onseek?: HowlEventHandler;
42
- readonly onunlock?: HowlEventHandler;
43
- readonly onresume?: HowlEventHandler;
30
+ readonly onend?: HowlCallback;
31
+ readonly onfade?: HowlCallback;
32
+ readonly onload?: HowlCallback;
33
+ readonly onloaderror?: HowlCallback;
34
+ readonly onplayerror?: HowlCallback;
35
+ readonly onpause?: HowlCallback;
36
+ readonly onplay?: HowlCallback;
37
+ readonly onstop?: HowlCallback;
38
+ readonly onmute?: HowlCallback;
39
+ readonly onvolume?: HowlCallback;
40
+ readonly onrate?: HowlCallback;
41
+ readonly onseek?: HowlCallback;
42
+ readonly onunlock?: HowlCallback;
43
+ readonly onresume?: HowlCallback;
44
44
  }
45
45
  export interface WebAudioNodeWithSource extends GainNode {
46
46
  bufferSource?: AudioBufferSourceNode;
package/target/wolf.js CHANGED
@@ -535,38 +535,45 @@ var Sound = class {
535
535
  }
536
536
  errorListener() {
537
537
  const self = this;
538
- const html = self._node;
539
- self.parent._emit("loaderror", self._id, html.error ? html.error.code.toString() : "0");
540
- html.removeEventListener("error", self._errorFn, false);
538
+ const sound = self._node;
539
+ if (sound && "duration" in sound) {
540
+ self.parent._emit("loaderror", self._id, sound.error ? sound.error.code.toString() : "0");
541
+ sound.removeEventListener("error", self._errorFn, false);
542
+ }
541
543
  }
542
544
  loadListener() {
543
545
  const self = this;
544
546
  const parent = self.parent;
545
- const html = self._node;
546
- parent._duration = Math.ceil(html.duration * 10) / 10;
547
- if (Object.keys(parent._sprite).length === 0) {
548
- parent._sprite = { "__default": [0, parent._duration * 1e3] };
549
- }
550
- if (parent._state !== "loaded") {
551
- parent._state = "loaded";
552
- parent._emit("load");
553
- parent._loadQueue();
547
+ const sound = self._node;
548
+ if (sound && "duration" in sound) {
549
+ parent._duration = Math.ceil(sound.duration * 10) / 10;
550
+ if (Object.keys(parent._sprite).length === 0) {
551
+ parent._sprite = { "__default": [0, parent._duration * 1e3] };
552
+ }
553
+ if (parent._state !== "loaded") {
554
+ parent._state = "loaded";
555
+ parent._emit("load");
556
+ parent._loadQueue();
557
+ }
558
+ sound.removeEventListener(this.howler._canPlayEvent, self._loadFn, false);
554
559
  }
555
- html.removeEventListener(this.howler._canPlayEvent, self._loadFn, false);
556
560
  }
557
561
  endListener() {
558
562
  const self = this;
559
563
  const parent = self.parent;
560
- const html = self._node;
561
- if (parent._duration === Infinity) {
562
- parent._duration = Math.ceil(html.duration * 10) / 10;
564
+ const sound = self._node;
565
+ if (!sound) {
566
+ return;
567
+ }
568
+ if ("duration" in sound && parent._duration === Infinity) {
569
+ parent._duration = Math.ceil(sound.duration * 10) / 10;
563
570
  const defaultSprite = parent._sprite["__default"];
564
571
  if (defaultSprite && defaultSprite[1] === Infinity) {
565
572
  defaultSprite[1] = parent._duration * 1e3;
566
573
  }
567
574
  parent._ended(self);
568
575
  }
569
- html.removeEventListener("ended", self._endFn, false);
576
+ sound.removeEventListener("ended", self._endFn, false);
570
577
  }
571
578
  };
572
579