@audiowalk/sdk 1.5.10 → 2.0.0-rc

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 (24) hide show
  1. package/dist/index.d.ts +6 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -4
  4. package/dist/player/{media-controls.d.ts → media-controls.controller.d.ts} +2 -2
  5. package/dist/player/media-controls.controller.d.ts.map +1 -0
  6. package/dist/player/{player-controller.d.ts → player.controller.d.ts} +1 -1
  7. package/dist/player/{player-controller.d.ts.map → player.controller.d.ts.map} +1 -1
  8. package/dist/player/{player-controller.js → player.controller.js} +2 -2
  9. package/dist/storage/file-storage.controller.d.ts +17 -0
  10. package/dist/storage/file-storage.controller.d.ts.map +1 -0
  11. package/dist/storage/file-storage.controller.js +66 -0
  12. package/dist/storage/{local-storage.d.ts → local-storage.controller.d.ts} +3 -2
  13. package/dist/storage/local-storage.controller.d.ts.map +1 -0
  14. package/dist/storage/{local-storage.js → local-storage.controller.js} +6 -3
  15. package/dist/storage/media-download.controller.d.ts +38 -0
  16. package/dist/storage/media-download.controller.d.ts.map +1 -0
  17. package/dist/storage/media-download.controller.js +83 -0
  18. package/dist/story/{story-controller.d.ts → story.controller.d.ts} +1 -1
  19. package/dist/story/{story-controller.d.ts.map → story.controller.d.ts.map} +1 -1
  20. package/dist/story/{story-controller.js → story.controller.js} +5 -5
  21. package/package.json +2 -1
  22. package/dist/player/media-controls.d.ts.map +0 -1
  23. package/dist/storage/local-storage.d.ts.map +0 -1
  24. /package/dist/player/{media-controls.js → media-controls.controller.js} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- export * from "./player/media-controls";
2
- export * from "./player/player-controller";
3
- export * from "./storage/local-storage";
4
- export * from "./story/story-controller";
1
+ export * from "./player/media-controls.controller";
2
+ export * from "./player/player.controller";
3
+ export * from "./storage/file-storage.controller";
4
+ export * from "./storage/local-storage.controller";
5
+ export * from "./storage/media-download.controller";
6
+ export * from "./story/story.controller";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
- export * from "./player/media-controls";
2
- export * from "./player/player-controller";
3
- export * from "./storage/local-storage";
4
- export * from "./story/story-controller";
1
+ export * from "./player/media-controls.controller";
2
+ export * from "./player/player.controller";
3
+ export * from "./storage/file-storage.controller";
4
+ export * from "./storage/local-storage.controller";
5
+ export * from "./storage/media-download.controller";
6
+ export * from "./story/story.controller";
@@ -1,4 +1,4 @@
1
- import { PlayerController } from "./player-controller";
1
+ import { PlayerController } from "./player.controller";
2
2
  export declare class MediaControlsController {
3
3
  private playerDetachEvent;
4
4
  setMetadata(metadata: MediaMetadataInit): void;
@@ -6,4 +6,4 @@ export declare class MediaControlsController {
6
6
  detachPlayer(): void;
7
7
  clear(): void;
8
8
  }
9
- //# sourceMappingURL=media-controls.d.ts.map
9
+ //# sourceMappingURL=media-controls.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-controls.controller.d.ts","sourceRoot":"","sources":["../../src/player/media-controls.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,WAAW,CAAC,QAAQ,EAAE,iBAAiB;IAMvC,YAAY,CAAC,MAAM,EAAE,gBAAgB;IAoCrC,YAAY;IASZ,KAAK;CAMN"}
@@ -55,4 +55,4 @@ export declare class PlayerController {
55
55
  private savePosition;
56
56
  private log;
57
57
  }
58
- //# sourceMappingURL=player-controller.d.ts.map
58
+ //# sourceMappingURL=player.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"player-controller.d.ts","sourceRoot":"","sources":["../../src/player/player-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAwC,OAAO,EAAmB,MAAM,MAAM,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;AAEzF,oBAAY,YAAY;IACtB,SAAS,YAAY;IACrB,QAAQ,WAAW;IACnB,OAAO,UAAU;CAClB;AAED,qBAAa,gBAAgB;IA+Bf,OAAO,CAAC,OAAO;IA9B3B,SAAgB,MAAM,gBAAuB;IAC7C,SAAgB,OAAO,gBAAuB;IAC9C,SAAgB,MAAM,gBAAuB;IAE7C,SAAgB,WAAW,0BAAkC;IAC7D,SAAgB,SAAS,iCAA4C;IACrE,SAAgB,QAAQ,2CAEtB;IAEF,SAAgB,MAAM,uCAAkD;IACxE,SAAgB,OAAO,qCAA2D;IAElF,OAAO,CAAC,aAAa,CAAmB;IAExC,OAAO,CAAC,YAAY,CAA0C;IAE9D,OAAO,CAAC,OAAO,CAA0B;IAEzC,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAuB;IAE3C,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,eAAe,CAAuB;gBAE1B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAuErF,IAAI,CAAC,IAAI,EAAE,MAAM;IAYjB,OAAO,CAAC,GAAG,GAAE,OAAe;IAkBlC,OAAO,CAAC,UAAU;IAQZ,OAAO;IAUP,IAAI,CAAC,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAqC;IAgBlE,KAAK;IAQL,IAAI,CAAC,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAqC;IAgBxE,MAAM,CAAC,OAAO,EAAE,MAAM;IAQhB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO;IAYzD,YAAY,CAAC,MAAM,EAAE,MAAM;IA6BjC,IAAI,CAAC,OAAO,GAAE,MAAW;IAKzB,OAAO,CAAC,OAAO,GAAE,MAAW;YAMd,YAAY;IAK1B,OAAO,CAAC,GAAG;CAOZ"}
1
+ {"version":3,"file":"player.controller.d.ts","sourceRoot":"","sources":["../../src/player/player.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAwC,OAAO,EAAmB,MAAM,MAAM,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;AAEzF,oBAAY,YAAY;IACtB,SAAS,YAAY;IACrB,QAAQ,WAAW;IACnB,OAAO,UAAU;CAClB;AAED,qBAAa,gBAAgB;IA+Bf,OAAO,CAAC,OAAO;IA9B3B,SAAgB,MAAM,gBAAuB;IAC7C,SAAgB,OAAO,gBAAuB;IAC9C,SAAgB,MAAM,gBAAuB;IAE7C,SAAgB,WAAW,0BAAkC;IAC7D,SAAgB,SAAS,iCAA4C;IACrE,SAAgB,QAAQ,2CAEtB;IAEF,SAAgB,MAAM,uCAAkD;IACxE,SAAgB,OAAO,qCAA2D;IAElF,OAAO,CAAC,aAAa,CAAmB;IAExC,OAAO,CAAC,YAAY,CAAoD;IAExE,OAAO,CAAC,OAAO,CAA0B;IAEzC,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAuB;IAE3C,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,eAAe,CAAuB;gBAE1B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAuErF,IAAI,CAAC,IAAI,EAAE,MAAM;IAYjB,OAAO,CAAC,GAAG,GAAE,OAAe;IAkBlC,OAAO,CAAC,UAAU;IAQZ,OAAO;IAUP,IAAI,CAAC,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAqC;IAgBlE,KAAK;IAQL,IAAI,CAAC,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAqC;IAgBxE,MAAM,CAAC,OAAO,EAAE,MAAM;IAQhB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO;IAYzD,YAAY,CAAC,MAAM,EAAE,MAAM;IA6BjC,IAAI,CAAC,OAAO,GAAE,MAAW;IAKzB,OAAO,CAAC,OAAO,GAAE,MAAW;YAMd,YAAY;IAK1B,OAAO,CAAC,GAAG;CAOZ"}
@@ -1,5 +1,5 @@
1
1
  import { BehaviorSubject, combineLatest, filter, interval, map, Subject, take, takeUntil } from "rxjs";
2
- import { LocalStorage } from "../storage/local-storage";
2
+ import { LocalStorageController } from "../storage/local-storage.controller";
3
3
  export var PlayerStatus;
4
4
  (function (PlayerStatus) {
5
5
  PlayerStatus["playing"] = "playing";
@@ -17,7 +17,7 @@ export class PlayerController {
17
17
  status = new BehaviorSubject(null);
18
18
  playing = this.status.pipe(map((status) => status === "playing"));
19
19
  playerElement;
20
- localStorage = new LocalStorage({ prefix: "player" });
20
+ localStorage = new LocalStorageController({ prefix: "player" });
21
21
  options;
22
22
  defaultOptions = {
23
23
  crossfadeTime: 2000,
@@ -0,0 +1,17 @@
1
+ export interface FileStorageControllerOptions {
2
+ version: number;
3
+ storeName: string;
4
+ }
5
+ export declare class FileStorageController {
6
+ private readonly options;
7
+ private db?;
8
+ constructor(options: FileStorageControllerOptions);
9
+ private getDatabase;
10
+ private createDB;
11
+ has(key: string): Promise<boolean>;
12
+ get<T>(key: string): Promise<T | null>;
13
+ put(key: string, value: any): Promise<void>;
14
+ delete(key: string): Promise<void>;
15
+ clear(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=file-storage.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage.controller.d.ts","sourceRoot":"","sources":["../../src/storage/file-storage.controller.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,EAAE,CAAC,CAAc;gBAEI,OAAO,EAAE,4BAA4B;YAEpD,WAAW;YAMX,QAAQ;IAgBhB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAStC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAY3B,MAAM,CAAC,GAAG,EAAE,MAAM;IAYlB,KAAK;CAQZ"}
@@ -0,0 +1,66 @@
1
+ export class FileStorageController {
2
+ options;
3
+ db;
4
+ constructor(options) {
5
+ this.options = options;
6
+ }
7
+ async getDatabase() {
8
+ if (!this.db)
9
+ this.db = await this.createDB();
10
+ return this.db;
11
+ }
12
+ async createDB() {
13
+ return new Promise((resolve, reject) => {
14
+ const result = indexedDB.open("audio", this.options.version);
15
+ result.onsuccess = (event) => {
16
+ resolve(event.target.result);
17
+ };
18
+ result.onerror = (event) => reject(event.target.error);
19
+ result.onupgradeneeded = (event) => {
20
+ const db = event.target.result;
21
+ db.createObjectStore(this.options.storeName);
22
+ };
23
+ });
24
+ }
25
+ async has(key) {
26
+ return this.get(key).then((value) => value !== null);
27
+ }
28
+ async get(key) {
29
+ const db = await this.getDatabase();
30
+ return new Promise((resolve, reject) => {
31
+ const request = db.transaction(this.options.storeName).objectStore(this.options.storeName).get(key);
32
+ request.onsuccess = () => resolve(request.result || null);
33
+ request.onerror = () => reject();
34
+ });
35
+ }
36
+ async put(key, value) {
37
+ const db = await this.getDatabase();
38
+ return new Promise((resolve, reject) => {
39
+ const request = db
40
+ .transaction(this.options.storeName, "readwrite")
41
+ .objectStore(this.options.storeName)
42
+ .put(value, key);
43
+ request.onsuccess = () => resolve();
44
+ request.onerror = () => reject();
45
+ });
46
+ }
47
+ async delete(key) {
48
+ const db = await this.getDatabase();
49
+ return new Promise((resolve, reject) => {
50
+ const request = db
51
+ .transaction(this.options.storeName, "readwrite")
52
+ .objectStore(this.options.storeName)
53
+ .delete(key);
54
+ request.onsuccess = () => resolve();
55
+ request.onerror = () => reject();
56
+ });
57
+ }
58
+ async clear() {
59
+ const db = await this.getDatabase();
60
+ return new Promise((resolve, reject) => {
61
+ const request = db.transaction(this.options.storeName, "readwrite").objectStore(this.options.storeName).clear();
62
+ request.onsuccess = () => resolve();
63
+ request.onerror = () => reject();
64
+ });
65
+ }
66
+ }
@@ -1,14 +1,15 @@
1
1
  export interface LocalStorageOptions {
2
2
  prefix?: string;
3
3
  }
4
- export declare class LocalStorage {
4
+ export declare class LocalStorageController {
5
5
  private options;
6
6
  private static readonly globalPrefix;
7
7
  constructor(options?: Partial<LocalStorageOptions>);
8
8
  static clearAll(prefix?: string): Promise<void>;
9
9
  get<T = unknown>(key: string, validate?: (value: unknown) => value is T): Promise<T | null>;
10
10
  set(key: string, value: any): Promise<void>;
11
+ delete(key: string): Promise<void>;
11
12
  private parseData;
12
13
  private getPrefixedKey;
13
14
  }
14
- //# sourceMappingURL=local-storage.d.ts.map
15
+ //# sourceMappingURL=local-storage.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-storage.controller.d.ts","sourceRoot":"","sources":["../../src/storage/local-storage.controller.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAE/B,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM;WAEjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAU/B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiB3F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAK3B,MAAM,CAAC,GAAG,EAAE,MAAM;IAIxB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,cAAc;CAQvB"}
@@ -1,11 +1,11 @@
1
- export class LocalStorage {
1
+ export class LocalStorageController {
2
2
  options;
3
3
  static globalPrefix = "audiowalk";
4
4
  constructor(options = {}) {
5
5
  this.options = options;
6
6
  }
7
7
  static async clearAll(prefix) {
8
- prefix = prefix ? `${LocalStorage.globalPrefix}-${prefix}` : LocalStorage.globalPrefix;
8
+ prefix = prefix ? `${LocalStorageController.globalPrefix}-${prefix}` : LocalStorageController.globalPrefix;
9
9
  const keys = Object.keys(window.localStorage);
10
10
  for (const key of keys) {
11
11
  if (key.startsWith(prefix)) {
@@ -34,6 +34,9 @@ export class LocalStorage {
34
34
  const data = JSON.stringify(value);
35
35
  return window.localStorage.setItem(this.getPrefixedKey(key), data);
36
36
  }
37
+ async delete(key) {
38
+ return window.localStorage.removeItem(this.getPrefixedKey(key));
39
+ }
37
40
  parseData(data) {
38
41
  try {
39
42
  return JSON.parse(data);
@@ -43,7 +46,7 @@ export class LocalStorage {
43
46
  }
44
47
  }
45
48
  getPrefixedKey(key) {
46
- const keyParts = [LocalStorage.globalPrefix];
49
+ const keyParts = [LocalStorageController.globalPrefix];
47
50
  if (this.options.prefix)
48
51
  keyParts.push(this.options.prefix);
49
52
  keyParts.push(key);
@@ -0,0 +1,38 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+ import { FileStorageController, FileStorageControllerOptions } from "./file-storage.controller";
3
+ import { LocalStorageController } from "./local-storage.controller";
4
+ export interface MediaServiceOptions extends FileStorageControllerOptions {
5
+ }
6
+ export declare enum DownloadStatus {
7
+ Checking = "checking",
8
+ NotDownloaded = "not-downloaded",
9
+ Downloading = "downloading",
10
+ Downloaded = "downloaded",
11
+ Error = "error"
12
+ }
13
+ export interface MediaFileDefinition<TrackId extends string> {
14
+ id: TrackId;
15
+ url: string;
16
+ mimeType: string;
17
+ }
18
+ export interface MediaFileDownloadMetadata {
19
+ isDownloaded?: boolean;
20
+ progress?: number | null;
21
+ }
22
+ export type MediaFile<TrackId extends string> = MediaFileDefinition<TrackId> & MediaFileDownloadMetadata;
23
+ export declare class MediaDownloadController<TrackId extends string> {
24
+ private readonly options;
25
+ downloadStatus: BehaviorSubject<DownloadStatus>;
26
+ downloadProgress: BehaviorSubject<number>;
27
+ fileStorage: FileStorageController;
28
+ localStorage: LocalStorageController;
29
+ tracks: Record<TrackId, MediaFile<TrackId>>;
30
+ constructor(tracks: Record<TrackId, MediaFileDefinition<TrackId>>, options: MediaServiceOptions);
31
+ getFiles(): Promise<MediaFile<TrackId>[]>;
32
+ getFile(trackId: TrackId): Promise<MediaFile<TrackId>>;
33
+ updateDownloadStatus(): Promise<void>;
34
+ downloadTracks(): Promise<void>;
35
+ deleteTracks(): Promise<void>;
36
+ private downloadTrack;
37
+ }
38
+ //# sourceMappingURL=media-download.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-download.controller.d.ts","sourceRoot":"","sources":["../../src/storage/media-download.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAW,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,WAAW,mBAAoB,SAAQ,4BAA4B;CAAG;AAE5E,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,aAAa,mBAAmB;IAChC,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,MAAM;IACzD,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,yBAAyB,CAAC;AAEzG,qBAAa,uBAAuB,CAAC,OAAO,SAAS,MAAM;IASU,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR3F,cAAc,kCAAqE;IACnF,gBAAgB,0BAAkC;IAElD,WAAW,EAAE,qBAAqB,CAAC;IACnC,YAAY,EAAE,sBAAsB,CAAC;IAErC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEhC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,EAAmB,OAAO,EAAE,mBAAmB;IAQ1G,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAIzC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAetD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC,cAAc;IAqBd,YAAY;YAUJ,aAAa;CAW5B"}
@@ -0,0 +1,83 @@
1
+ import axios from "axios";
2
+ import { BehaviorSubject, Subject } from "rxjs";
3
+ import { FileStorageController } from "./file-storage.controller";
4
+ import { LocalStorageController } from "./local-storage.controller";
5
+ export var DownloadStatus;
6
+ (function (DownloadStatus) {
7
+ DownloadStatus["Checking"] = "checking";
8
+ DownloadStatus["NotDownloaded"] = "not-downloaded";
9
+ DownloadStatus["Downloading"] = "downloading";
10
+ DownloadStatus["Downloaded"] = "downloaded";
11
+ DownloadStatus["Error"] = "error";
12
+ })(DownloadStatus || (DownloadStatus = {}));
13
+ export class MediaDownloadController {
14
+ options;
15
+ downloadStatus = new BehaviorSubject(DownloadStatus.NotDownloaded);
16
+ downloadProgress = new BehaviorSubject(0);
17
+ fileStorage;
18
+ localStorage;
19
+ tracks;
20
+ constructor(tracks, options) {
21
+ this.options = options;
22
+ this.tracks = tracks;
23
+ this.fileStorage = new FileStorageController(options);
24
+ this.localStorage = new LocalStorageController();
25
+ this.updateDownloadStatus();
26
+ }
27
+ async getFiles() {
28
+ return Promise.all(Object.values(this.tracks).map((fileDef) => this.getFile(fileDef.id)));
29
+ }
30
+ async getFile(trackId) {
31
+ const trackDef = this.tracks[trackId];
32
+ if (!trackDef)
33
+ throw new Error(`Track ${trackId} not found`);
34
+ const storedData = await this.fileStorage.get(trackDef.id).catch(() => null);
35
+ const url = storedData ? URL.createObjectURL(new Blob([storedData], { type: trackDef.mimeType })) : trackDef.url;
36
+ const isDownloaded = !!storedData;
37
+ const progress = await this.localStorage
38
+ .get(`progress-${trackDef.id}`, (value) => typeof value === "number")
39
+ .catch(() => null);
40
+ return { ...trackDef, url, progress, isDownloaded };
41
+ }
42
+ async updateDownloadStatus() {
43
+ this.downloadStatus.next(DownloadStatus.Checking);
44
+ const downloadStatus = await this.getFiles()
45
+ .catch(() => [])
46
+ .then((tracks) => tracks.every((track) => track.isDownloaded));
47
+ this.downloadStatus.next(downloadStatus ? DownloadStatus.Downloaded : DownloadStatus.NotDownloaded);
48
+ }
49
+ async downloadTracks() {
50
+ const trackDefs = Object.values(this.tracks);
51
+ this.downloadStatus.next(DownloadStatus.Downloading);
52
+ this.downloadProgress.next(0);
53
+ try {
54
+ for (let [i, track] of trackDefs.entries()) {
55
+ const trackProgress = new Subject();
56
+ trackProgress.subscribe((progress) => this.downloadProgress.next((i * 1) / trackDefs.length + progress / trackDefs.length));
57
+ await this.downloadTrack(track, trackProgress);
58
+ }
59
+ this.downloadStatus.next(DownloadStatus.Downloaded);
60
+ }
61
+ catch (e) {
62
+ this.downloadStatus.next(DownloadStatus.Error);
63
+ }
64
+ }
65
+ async deleteTracks() {
66
+ const trackDefs = Object.values(this.tracks);
67
+ for (let [i, track] of trackDefs.entries()) {
68
+ await this.fileStorage.delete(track.id).catch();
69
+ }
70
+ await this.updateDownloadStatus();
71
+ }
72
+ async downloadTrack(trackDef, progress) {
73
+ console.debug("Downloading track", trackDef.id, trackDef.url);
74
+ const res = await axios.get(trackDef.url, {
75
+ responseType: "arraybuffer",
76
+ onDownloadProgress: (e) => {
77
+ if (e.total)
78
+ progress.next(e.loaded / e.total);
79
+ },
80
+ });
81
+ await this.fileStorage.put(trackDef.id, res.data);
82
+ }
83
+ }
@@ -36,4 +36,4 @@ export declare class StoryController<ChapterId extends string = string, StorySta
36
36
  private loadState;
37
37
  private saveState;
38
38
  }
39
- //# sourceMappingURL=story-controller.d.ts.map
39
+ //# sourceMappingURL=story.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"story-controller.d.ts","sourceRoot":"","sources":["../../src/story/story-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,OAAO,EAAE,MAAM,MAAM,CAAC;AAG3E,MAAM,WAAW,sBAAsB,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE;IACnG,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC;CAClH;AAED,MAAM,WAAW,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAChE,cAAc,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB,CAAC,UAAU;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,UAAU,CAAC;CACrD;AAED,MAAM,WAAW,eAAe,CAC9B,SAAS,SAAS,MAAM,GAAG,MAAM,EACjC,UAAU,SAAS;IAAE,cAAc,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAC9E,iBAAiB,SAAS,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAC9F,SAAS,EACT,UAAU,CACX;IAED,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC/C,YAAY,EAAE,UAAU,CAAC;CAC1B;AAED,qBAAa,eAAe,CAC1B,SAAS,SAAS,MAAM,GAAG,MAAM,EACjC,UAAU,SAAS;IAAE,cAAc,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAC9E,iBAAiB,SAAS,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAC9F,SAAS,EACT,UAAU,CACX;aAWiB,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC;IAChF,OAAO,CAAC,OAAO;IAVjB,SAAgB,UAAU,8BAA8C;IACxE,SAAgB,cAAc,4CAAuD;IACrF,SAAgB,GAAG,gBAAuB;IAE1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;gBAGzB,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,EACxE,OAAO,GAAE,sBAAsB,CAAC,UAAU,CAAM;IAgBpD,QAAQ,CAAC,KAAK,EAAE,UAAU;IAK1B,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAC;IAa7E,UAAU,CAAC,MAAM,EAAE,SAAS;IAI5B,WAAW;IAuBX,UAAU;IAKhB,QAAQ;YAIM,SAAS;YAaT,SAAS;CAGxB"}
1
+ {"version":3,"file":"story.controller.d.ts","sourceRoot":"","sources":["../../src/story/story.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,OAAO,EAAE,MAAM,MAAM,CAAC;AAG3E,MAAM,WAAW,sBAAsB,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE;IACnG,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC;CAClH;AAED,MAAM,WAAW,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAChE,cAAc,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB,CAAC,UAAU;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,UAAU,CAAC;CACrD;AAED,MAAM,WAAW,eAAe,CAC9B,SAAS,SAAS,MAAM,GAAG,MAAM,EACjC,UAAU,SAAS;IAAE,cAAc,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAC9E,iBAAiB,SAAS,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAC9F,SAAS,EACT,UAAU,CACX;IAED,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC/C,YAAY,EAAE,UAAU,CAAC;CAC1B;AAED,qBAAa,eAAe,CAC1B,SAAS,SAAS,MAAM,GAAG,MAAM,EACjC,UAAU,SAAS;IAAE,cAAc,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAC9E,iBAAiB,SAAS,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAC9F,SAAS,EACT,UAAU,CACX;aAWiB,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC;IAChF,OAAO,CAAC,OAAO;IAVjB,SAAgB,UAAU,8BAA8C;IACxE,SAAgB,cAAc,4CAAuD;IACrF,SAAgB,GAAG,gBAAuB;IAE1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IAEtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;gBAGzB,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,EACxE,OAAO,GAAE,sBAAsB,CAAC,UAAU,CAAM;IAgBpD,QAAQ,CAAC,KAAK,EAAE,UAAU;IAK1B,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAC;IAa7E,UAAU,CAAC,MAAM,EAAE,SAAS;IAI5B,WAAW;IAuBX,UAAU;IAKhB,QAAQ;YAIM,SAAS;YAaT,SAAS;CAGxB"}
@@ -1,5 +1,5 @@
1
1
  import { BehaviorSubject, distinctUntilChanged, map, Subject } from "rxjs";
2
- import { LocalStorage } from "../storage/local-storage";
2
+ import { LocalStorageController } from "../storage/local-storage.controller";
3
3
  export class StoryController {
4
4
  story;
5
5
  options;
@@ -11,7 +11,7 @@ export class StoryController {
11
11
  constructor(story, options = {}) {
12
12
  this.story = story;
13
13
  this.options = options;
14
- this.localStorage = new LocalStorage({ prefix: options.stateStorageKey ?? "story-state" });
14
+ this.localStorage = new LocalStorageController({ prefix: options.stateStorageKey ?? "story-state" });
15
15
  this.storyState
16
16
  .pipe(map((state) => state.currentChapter))
17
17
  .pipe(distinctUntilChanged())
@@ -54,13 +54,13 @@ export class StoryController {
54
54
  }
55
55
  if (typeof chapter.nextChapter === "function") {
56
56
  const storyState = this.storyState.value;
57
- const string = await chapter.nextChapter(storyState);
58
- return this.setChapter(string);
57
+ const chapterId = await chapter.nextChapter(storyState);
58
+ return this.setChapter(chapterId);
59
59
  }
60
60
  throw new Error(`Invalid nextChapter type in chapter ${chapter.id}`);
61
61
  }
62
62
  async resetStory() {
63
- await LocalStorage.clearAll();
63
+ await LocalStorageController.clearAll();
64
64
  await this.setState(this.story.initialState);
65
65
  }
66
66
  endStory() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audiowalk/sdk",
3
- "version": "1.5.10",
3
+ "version": "2.0.0-rc",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/audiowalk-cz/components.git"
@@ -27,6 +27,7 @@
27
27
  "typescript": "^5.6.2"
28
28
  },
29
29
  "dependencies": {
30
+ "axios": "^1.7.7",
30
31
  "rxjs": "^7.8.1"
31
32
  }
32
33
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-controls.d.ts","sourceRoot":"","sources":["../../src/player/media-controls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,WAAW,CAAC,QAAQ,EAAE,iBAAiB;IAMvC,YAAY,CAAC,MAAM,EAAE,gBAAgB;IAoCrC,YAAY;IASZ,KAAK;CAMN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-storage.d.ts","sourceRoot":"","sources":["../../src/storage/local-storage.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAE/B,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM;WAEjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAU/B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiB3F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAKjC,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,cAAc;CAQvB"}