@audiowalk/sdk 1.5.10 → 3.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.
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/player/{media-controls.d.ts → media-controls.controller.d.ts} +2 -2
- package/dist/player/media-controls.controller.d.ts.map +1 -0
- package/dist/player/{player-controller.d.ts → player.controller.d.ts} +1 -1
- package/dist/player/{player-controller.d.ts.map → player.controller.d.ts.map} +1 -1
- package/dist/player/{player-controller.js → player.controller.js} +2 -2
- package/dist/storage/file-storage.controller.d.ts +17 -0
- package/dist/storage/file-storage.controller.d.ts.map +1 -0
- package/dist/storage/file-storage.controller.js +66 -0
- package/dist/storage/{local-storage.d.ts → local-storage.controller.d.ts} +3 -2
- package/dist/storage/local-storage.controller.d.ts.map +1 -0
- package/dist/storage/{local-storage.js → local-storage.controller.js} +6 -3
- package/dist/storage/media-download.controller.d.ts +38 -0
- package/dist/storage/media-download.controller.d.ts.map +1 -0
- package/dist/storage/media-download.controller.js +83 -0
- package/dist/story/{story-controller.d.ts → story.controller.d.ts} +1 -1
- package/dist/story/{story-controller.d.ts.map → story.controller.d.ts.map} +1 -1
- package/dist/story/{story-controller.js → story.controller.js} +5 -5
- package/package.json +2 -1
- package/dist/player/media-controls.d.ts.map +0 -1
- package/dist/storage/local-storage.d.ts.map +0 -1
- /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
|
|
3
|
-
export * from "./storage/
|
|
4
|
-
export * from "./
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,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
|
|
3
|
-
export * from "./storage/
|
|
4
|
-
export * from "./
|
|
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
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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 ? `${
|
|
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 = [
|
|
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
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story
|
|
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 {
|
|
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
|
|
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
|
|
58
|
-
return this.setChapter(
|
|
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
|
|
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": "
|
|
3
|
+
"version": "3.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"}
|
|
File without changes
|