@playkit-js/playkit-js-providers 2.40.1 → 2.40.2-canary.0-c7a43ae

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 (135) hide show
  1. package/dist/index.d.ts +1624 -0
  2. package/dist/playkit-analytics-service.js +1 -1
  3. package/dist/playkit-analytics-service.js.map +1 -1
  4. package/dist/playkit-bookmark-service.js +1 -1
  5. package/dist/playkit-bookmark-service.js.map +1 -1
  6. package/dist/playkit-ott-provider.js +1 -1
  7. package/dist/playkit-ott-provider.js.map +1 -1
  8. package/dist/playkit-ovp-provider.js +1 -1
  9. package/dist/playkit-ovp-provider.js.map +1 -1
  10. package/dist/playkit-stats-service.js +1 -1
  11. package/dist/playkit-stats-service.js.map +1 -1
  12. package/dist/tsdoc-metadata.json +11 -0
  13. package/flow-typed/types/media-config-sources.js +1 -1
  14. package/flow-typed/types/media-sources.js +1 -1
  15. package/package.json +49 -46
  16. package/playkit-analytics-service/package.json +5 -0
  17. package/playkit-bookmark-service/package.json +5 -0
  18. package/playkit-ott-provider/package.json +5 -0
  19. package/playkit-ovp-provider/package.json +5 -0
  20. package/playkit-stats-service/package.json +5 -0
  21. package/src/entities/bumper.ts +21 -0
  22. package/src/entities/drm.ts +47 -0
  23. package/src/entities/entry-list.ts +13 -0
  24. package/src/entities/image-source.ts +36 -0
  25. package/src/entities/media-entry.ts +104 -0
  26. package/src/entities/media-format.ts +47 -0
  27. package/src/entities/media-source.ts +70 -0
  28. package/src/entities/media-sources.ts +79 -0
  29. package/src/entities/playlist.ts +41 -0
  30. package/src/k-provider/common/base-provider-parser.ts +0 -0
  31. package/src/k-provider/common/base-provider.ts +112 -0
  32. package/src/k-provider/common/base-service-result.ts +56 -0
  33. package/src/k-provider/common/data-loader-manager.ts +115 -0
  34. package/src/k-provider/common/multi-request-builder.ts +111 -0
  35. package/src/k-provider/common/response-types/kaltura-access-control-message.ts +21 -0
  36. package/src/k-provider/common/response-types/kaltura-drm-playback-plugin-data.ts +38 -0
  37. package/src/k-provider/ott/config.ts +22 -0
  38. package/src/k-provider/ott/index.ts +14 -0
  39. package/src/k-provider/ott/loaders/asset-list-loader.ts +68 -0
  40. package/src/k-provider/ott/loaders/asset-loader.ts +69 -0
  41. package/src/k-provider/ott/loaders/data-loader-manager.ts +15 -0
  42. package/src/k-provider/ott/loaders/session-loader.ts +62 -0
  43. package/src/k-provider/ott/provider-parser.ts +285 -0
  44. package/src/k-provider/ott/provider.ts +252 -0
  45. package/src/k-provider/ott/response-types/kaltura-asset.ts +105 -0
  46. package/src/k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.ts +27 -0
  47. package/src/k-provider/ott/response-types/kaltura-playback-context.ts +73 -0
  48. package/src/k-provider/ott/response-types/kaltura-playback-source.ts +62 -0
  49. package/src/k-provider/ott/response-types/kaltura-rule-action.ts +25 -0
  50. package/src/k-provider/ott/services/asset-service.ts +50 -0
  51. package/src/k-provider/ott/services/bookmark/bookmark-service.ts +48 -0
  52. package/src/k-provider/ott/services/bookmark/index.ts +11 -0
  53. package/src/k-provider/ott/services/ott-service.ts +33 -0
  54. package/src/k-provider/ott/services/user-service.ts +31 -0
  55. package/src/k-provider/ovp/config.ts +28 -0
  56. package/src/k-provider/ovp/external-captions-builder.ts +37 -0
  57. package/src/k-provider/ovp/index.ts +13 -0
  58. package/src/k-provider/ovp/loaders/data-loader-manager.ts +17 -0
  59. package/src/k-provider/ovp/loaders/entry-list-loader.ts +69 -0
  60. package/src/k-provider/ovp/loaders/media-entry-loader.ts +84 -0
  61. package/src/k-provider/ovp/loaders/playlist-loader.ts +69 -0
  62. package/src/k-provider/ovp/loaders/session-loader.ts +62 -0
  63. package/src/k-provider/ovp/loaders/ui-config-loader.ts +71 -0
  64. package/src/k-provider/ovp/play-source-url-builder.ts +59 -0
  65. package/src/k-provider/ovp/provider-parser.ts +461 -0
  66. package/src/k-provider/ovp/provider.ts +358 -0
  67. package/src/k-provider/ovp/regex-action-handler.ts +149 -0
  68. package/src/k-provider/ovp/request-params/base-entry-response-profile.ts +28 -0
  69. package/src/k-provider/ovp/response-types/index.ts +21 -0
  70. package/src/k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.ts +35 -0
  71. package/src/k-provider/ovp/response-types/kaltura-base-entry-list-response.ts +30 -0
  72. package/src/k-provider/ovp/response-types/kaltura-bumper.ts +25 -0
  73. package/src/k-provider/ovp/response-types/kaltura-flavor-asset.ts +108 -0
  74. package/src/k-provider/ovp/response-types/kaltura-media-entries.ts +28 -0
  75. package/src/k-provider/ovp/response-types/kaltura-media-entry.ts +189 -0
  76. package/src/k-provider/ovp/response-types/kaltura-metadata-list-response.ts +22 -0
  77. package/src/k-provider/ovp/response-types/kaltura-metadata.ts +50 -0
  78. package/src/k-provider/ovp/response-types/kaltura-playback-context.ts +95 -0
  79. package/src/k-provider/ovp/response-types/kaltura-playback-source.ts +89 -0
  80. package/src/k-provider/ovp/response-types/kaltura-playlist.ts +33 -0
  81. package/src/k-provider/ovp/response-types/kaltura-rule-action.ts +27 -0
  82. package/src/k-provider/ovp/response-types/kaltura-ui-conf-response.ts +89 -0
  83. package/src/k-provider/ovp/response-types/kaltura-user-entry-list-response.ts +30 -0
  84. package/src/k-provider/ovp/response-types/kaltura-user-entry.ts +57 -0
  85. package/src/k-provider/ovp/services/analytics/analytics-service.ts +58 -0
  86. package/src/k-provider/ovp/services/analytics/index.ts +11 -0
  87. package/src/k-provider/ovp/services/base-entry-service.ts +75 -0
  88. package/src/k-provider/ovp/services/meta-data-service.ts +29 -0
  89. package/src/k-provider/ovp/services/ovp-service.ts +32 -0
  90. package/src/k-provider/ovp/services/playlist-service.ts +95 -0
  91. package/src/k-provider/ovp/services/session-service.ts +27 -0
  92. package/src/k-provider/ovp/services/stats/index.ts +11 -0
  93. package/src/k-provider/ovp/services/stats/stats-service.ts +32 -0
  94. package/src/k-provider/ovp/services/ui-conf-service.ts +32 -0
  95. package/src/types/adapter-data-config.ts +1 -0
  96. package/src/types/caption-type.ts +1 -0
  97. package/src/types/drm-data.ts +5 -0
  98. package/src/types/entry-list.ts +6 -0
  99. package/src/types/env-config.ts +7 -0
  100. package/src/types/external-caption-object.ts +7 -0
  101. package/src/types/filter-options.ts +3 -0
  102. package/src/types/index.ts +34 -0
  103. package/src/types/loader.ts +7 -0
  104. package/src/types/media-config-metadata.ts +13 -0
  105. package/src/types/media-config-session.ts +6 -0
  106. package/src/types/media-config-sources.ts +20 -0
  107. package/src/types/media-config.ts +8 -0
  108. package/src/types/media-entry.ts +16 -0
  109. package/src/types/media-format.ts +5 -0
  110. package/src/types/media-info.ts +21 -0
  111. package/src/types/media-source.ts +12 -0
  112. package/src/types/media-sources.ts +11 -0
  113. package/src/types/network-retry-parameters.ts +5 -0
  114. package/src/types/playback-context.ts +10 -0
  115. package/src/types/playlist-info.ts +4 -0
  116. package/src/types/playlist-item.ts +5 -0
  117. package/src/types/playlist-metadata.ts +4 -0
  118. package/src/types/playlist.ts +10 -0
  119. package/src/types/poster.ts +5 -0
  120. package/src/types/provider-options.ts +17 -0
  121. package/src/types/request-loader.ts +6 -0
  122. package/src/util/clone.ts +23 -0
  123. package/src/util/error/category.ts +11 -0
  124. package/src/util/error/code.ts +77 -0
  125. package/src/util/error/error.ts +47 -0
  126. package/src/util/error/severity.ts +21 -0
  127. package/src/util/logger.ts +108 -0
  128. package/src/util/param.ts +45 -0
  129. package/src/util/request-builder.ts +187 -0
  130. package/src/util/xml-parser.ts +39 -0
  131. package/CHANGELOG.md +0 -959
  132. package/samples/ott/bookmark.html +0 -23
  133. package/samples/ott/provider.html +0 -28
  134. package/samples/ovp/provider.html +0 -30
  135. package/samples/ovp/stats.html +0 -17
@@ -0,0 +1,104 @@
1
+ import MediaSources from './media-sources';
2
+ import {ProviderMediaEntryObject} from '../types';
3
+ import {Poster} from '../types/poster';
4
+
5
+ export default class MediaEntry {
6
+ public static Type: {[type: string]: string} = {
7
+ VOD: 'Vod',
8
+ LIVE: 'Live',
9
+ IMAGE: 'Image',
10
+ AUDIO: 'Audio',
11
+ UNKNOWN: 'Unknown'
12
+ };
13
+ public static DvrStatus: {[type: string]: number} = {
14
+ ON: 1,
15
+ OFF: 0
16
+ };
17
+
18
+ /**
19
+ * @member - entry id
20
+ * @type {string}
21
+ */
22
+ public id?: string;
23
+ /**
24
+ * @member - entry name
25
+ * @type {string}
26
+ */
27
+ public name?: string;
28
+ /**
29
+ * @member - entry sources
30
+ * @type {MediaSources}
31
+ */
32
+ public sources: MediaSources;
33
+ /**
34
+ * @member - entry duration
35
+ * @type {number}
36
+ */
37
+ public duration?: number;
38
+ /**
39
+ * @member - entry type
40
+ * @type {string}
41
+ */
42
+ public type: string;
43
+ /**
44
+ * @member - entry metadata
45
+ * @type {Object}
46
+ */
47
+ public metadata: any;
48
+ /**
49
+ * @member - DVR status
50
+ * @type {number}
51
+ */
52
+ public dvrStatus?: number;
53
+ /**
54
+ * @member - media status
55
+ * @type {number}
56
+ */
57
+ public status?: number;
58
+ /**
59
+ * @member - media poster
60
+ * @type {string | Array<Object>}
61
+ */
62
+ public poster?: string | Poster[];
63
+
64
+ /**
65
+ * @member - assetReferenceType
66
+ * @type {string }
67
+ */
68
+ public assetReferenceType?: string;
69
+
70
+ /**
71
+ * @member - The download URL of the entry.
72
+ * @type {string}
73
+ */
74
+ public downloadUrl?: string;
75
+
76
+ /**
77
+ * @constructor
78
+ */
79
+ constructor() {
80
+ this.metadata = new Map();
81
+ this.sources = new MediaSources();
82
+ this.type = MediaEntry.Type.UNKNOWN;
83
+ }
84
+
85
+ /**
86
+ * Convert class to native js object.
87
+ * @returns {ProviderMediaEntryObject} - The json class object.
88
+ */
89
+ public toJSON(): ProviderMediaEntryObject {
90
+ return {
91
+ id: this.id,
92
+ name: this.name,
93
+ sources: this.sources.toJSON(),
94
+ duration: this.duration,
95
+ dvrStatus: this.dvrStatus,
96
+ status: this.status,
97
+ metadata: this.metadata,
98
+ type: this.type,
99
+ poster: this.poster,
100
+ assetReferenceType: this.assetReferenceType,
101
+ downloadUrl: this.downloadUrl
102
+ };
103
+ }
104
+ }
@@ -0,0 +1,47 @@
1
+ import {ProviderMediaFormatType} from '../types';
2
+
3
+ export const MediaFormat: {[name: string]: ProviderMediaFormatType} = {
4
+ DASH: {
5
+ name: 'dash',
6
+ mimeType: 'application/dash+xml',
7
+ pathExt: 'mpd'
8
+ },
9
+ HLS: {
10
+ name: 'hls',
11
+ mimeType: 'application/x-mpegURL',
12
+ pathExt: 'm3u8'
13
+ },
14
+ WVM: {
15
+ name: 'wvm',
16
+ mimeType: 'video/wvm',
17
+ pathExt: 'wvm'
18
+ },
19
+ MP4: {
20
+ name: 'mp4',
21
+ mimeType: 'video/mp4',
22
+ pathExt: 'mp4'
23
+ },
24
+ MP3: {
25
+ name: 'mp3',
26
+ mimeType: 'audio/mpeg',
27
+ pathExt: 'mp3'
28
+ }
29
+ };
30
+
31
+ export const SupportedStreamFormat: Map<string, ProviderMediaFormatType> = new Map([
32
+ ['mpegdash', MediaFormat.DASH],
33
+ ['applehttp', MediaFormat.HLS],
34
+ ['url', MediaFormat.MP4]
35
+ ]);
36
+
37
+ /**
38
+ * returns a boolean whether a source is progressive or not
39
+ * @param {string} formatName - the format name
40
+ * @returns {boolean} - if source is progressive or not
41
+ */
42
+ function isProgressiveSource(formatName: string): boolean {
43
+ const sourceFormat = SupportedStreamFormat.get(formatName);
44
+ return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;
45
+ }
46
+
47
+ export {isProgressiveSource};
@@ -0,0 +1,70 @@
1
+ import Drm from './drm';
2
+ import {ProviderMediaSourceObject} from '../types';
3
+
4
+ export default class MediaSource {
5
+ /**
6
+ * @member - media source id
7
+ * @type {string}
8
+ */
9
+ public id!: string;
10
+ /**
11
+ * @member - media source url
12
+ * @type {string}
13
+ */
14
+ public url!: string;
15
+ /**
16
+ * @member - media source mimetype
17
+ * @type {string}
18
+ */
19
+ public mimetype!: string;
20
+ /**
21
+ * @member - media source drm data
22
+ * @type {Array<Drm>}
23
+ */
24
+ public drmData?: Array<Drm>;
25
+ /**
26
+ * @member - media source bandwidth
27
+ * @type {number}
28
+ */
29
+ public bandwidth?: number;
30
+ /**
31
+ * @member - media source width
32
+ * @type {number}
33
+ */
34
+ public width?: number;
35
+ /**
36
+ * @member - media source height
37
+ * @type {number}
38
+ */
39
+ public height?: number;
40
+ /**
41
+ * @member - media source label
42
+ * @type {string}
43
+ */
44
+ public label?: string;
45
+
46
+ /**
47
+ * Convert class to native js object.
48
+ * @returns {ProviderMediaSourceObject} - The json class object.
49
+ */
50
+ public toJSON(): ProviderMediaSourceObject {
51
+ const response: ProviderMediaSourceObject = {
52
+ id: this.id,
53
+ url: this.url,
54
+ mimetype: this.mimetype
55
+ };
56
+ if (this.bandwidth) response.bandwidth = this.bandwidth;
57
+ if (this.width) response.width = this.width;
58
+ if (this.height) response.height = this.height;
59
+ if (this.label) response.label = this.label;
60
+ if (this.drmData && this.drmData.length > 0) {
61
+ response.drmData = [];
62
+ this.drmData.forEach(d => {
63
+ if (Array.isArray(response.drmData)) {
64
+ response.drmData.push(d.toJSON());
65
+ }
66
+ });
67
+ }
68
+ return response;
69
+ }
70
+ }
@@ -0,0 +1,79 @@
1
+ import MediaSource from './media-source';
2
+ import {MediaFormat} from './media-format';
3
+ import {ImageSource} from './image-source';
4
+ import {PKExternalCaptionObject, ProviderMediaFormatType, ProviderMediaSourcesObject} from '../types';
5
+
6
+ export default class MediaSources {
7
+ /**
8
+ * Progressive download media sources container.
9
+ * @type {Array<MediaSource>}
10
+ * @public
11
+ */
12
+ public progressive: Array<MediaSource>;
13
+ /**
14
+ * Dash media sources container.
15
+ * @type {Array<MediaSource>}
16
+ * @public
17
+ */
18
+ public dash: Array<MediaSource>;
19
+ /**
20
+ * Hls media sources container.
21
+ * @type {Array<MediaSource>}
22
+ * @public
23
+ */
24
+ public hls: Array<MediaSource>;
25
+ public image: Array<ImageSource>;
26
+ public captions?: Array<PKExternalCaptionObject>;
27
+
28
+ /**
29
+ * @constructor
30
+ */
31
+ constructor() {
32
+ this.progressive = [];
33
+ this.dash = [];
34
+ this.hls = [];
35
+ this.image = [];
36
+ }
37
+
38
+ /**
39
+ * Maps the source to one of the containers according to his media format.
40
+ * @param {MediaSource} source - The source to add to one of the containers.
41
+ * @param {MediaFormat} mediaFormat - The media format of the source.
42
+ * @returns {void}
43
+ */
44
+ public map(source: MediaSource, mediaFormat?: ProviderMediaFormatType): void {
45
+ if (mediaFormat) {
46
+ switch (mediaFormat.name) {
47
+ case MediaFormat.MP4.name:
48
+ this.progressive.push(source);
49
+ break;
50
+ case MediaFormat.DASH.name:
51
+ this.dash.push(source);
52
+ break;
53
+ case MediaFormat.HLS.name:
54
+ this.hls.push(source);
55
+ break;
56
+ default:
57
+ break;
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Convert class to native js object.
64
+ * @returns {ProviderMediaSourcesObject} - The json class object.
65
+ */
66
+ public toJSON(): ProviderMediaSourcesObject {
67
+ const response: ProviderMediaSourcesObject = {
68
+ progressive: [],
69
+ dash: [],
70
+ hls: [],
71
+ image: []
72
+ };
73
+ this.progressive.forEach(p => response.progressive.push(p.toJSON()));
74
+ this.hls.forEach(h => response.hls.push(h.toJSON()));
75
+ this.dash.forEach(d => response.dash.push(d.toJSON()));
76
+ response.image = this.image;
77
+ return response;
78
+ }
79
+ }
@@ -0,0 +1,41 @@
1
+ import MediaEntry from '../entities/media-entry';
2
+
3
+ export default class Playlist {
4
+ /**
5
+ * @member - playlist id
6
+ * @type {string}
7
+ */
8
+ public id?: string;
9
+ /**
10
+ * @member - playlist name
11
+ * @type {string}
12
+ */
13
+ public name?: string;
14
+ /**
15
+ * @member - playlist description
16
+ * @type {string}
17
+ */
18
+ public description?: string;
19
+
20
+ /**
21
+ * @member - playlist poster
22
+ * @type {string}
23
+ */
24
+ public poster?: string;
25
+
26
+ /**
27
+ * @member - playlist items
28
+ * @type {Array<MediaEntry>}
29
+ */
30
+ public items: Array<MediaEntry>;
31
+
32
+ /**
33
+ * @member - playlist last played entry
34
+ * @type {string}
35
+ */
36
+ public playlistLastEntryId?: string;
37
+
38
+ constructor() {
39
+ this.items = [];
40
+ }
41
+ }
File without changes
@@ -0,0 +1,112 @@
1
+ import {getLogLevel, setLogLevel, setLogger, LogLevelType, LogLevel} from '../../util/logger';
2
+ import DataLoaderManager from './data-loader-manager';
3
+ import Error from '../../util/error/error';
4
+ import {ProviderEntryListObject, ProviderMediaConfigObject, ProviderPlaylistInfoObject, ProviderMediaConfigSourcesObject, ProviderNetworkRetryParameters, ProviderOptionsObject, ProviderPlaylistObject} from '../../types';
5
+
6
+ export default class BaseProvider<MI> {
7
+ private _partnerId: number;
8
+ private _widgetId?: string;
9
+ private _ks: string;
10
+ private _uiConfId?: number;
11
+ public _dataLoader!: DataLoaderManager;
12
+ private _playerVersion: string;
13
+ public _logger: any;
14
+ protected _isAnonymous: boolean;
15
+ public _networkRetryConfig: ProviderNetworkRetryParameters = {
16
+ async: true,
17
+ timeout: 0,
18
+ maxAttempts: 4
19
+ };
20
+
21
+ public get partnerId(): number {
22
+ return this._partnerId;
23
+ }
24
+
25
+ public get widgetId(): string {
26
+ return this._widgetId || this.defaultWidgetId;
27
+ }
28
+
29
+ public get defaultWidgetId(): string {
30
+ return '_' + this._partnerId;
31
+ }
32
+
33
+ public get uiConfId(): number | undefined {
34
+ return this._uiConfId;
35
+ }
36
+
37
+ public get ks(): string {
38
+ return this._ks;
39
+ }
40
+
41
+ public set ks(value: string) {
42
+ this._ks = value;
43
+ }
44
+
45
+ public get playerVersion(): string {
46
+ return this._playerVersion;
47
+ }
48
+
49
+ public get isAnonymous(): boolean {
50
+ return this._isAnonymous;
51
+ }
52
+
53
+ constructor(options: ProviderOptionsObject, playerVersion: string) {
54
+ setLogger(options.logger);
55
+ this._partnerId = options.partnerId;
56
+ this._widgetId = options.widgetId;
57
+ this._uiConfId = options.uiConfId;
58
+ this._isAnonymous = !options.ks;
59
+ this._ks = options.ks || '';
60
+ this._playerVersion = playerVersion;
61
+ }
62
+
63
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
64
+ public getMediaConfig(mediaInfo: MI): Promise<ProviderMediaConfigObject> {
65
+ return Promise.reject(
66
+ new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
67
+ message: 'getMediaConfig method must be implement by the derived class'
68
+ })
69
+ );
70
+ }
71
+
72
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
73
+ public getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {
74
+ return Promise.reject(
75
+ new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
76
+ message: 'The provider does not support loading playlist by id'
77
+ })
78
+ );
79
+ }
80
+
81
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
82
+ public getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {
83
+ return Promise.reject(
84
+ new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
85
+ message: 'The provider does not support loading entry list'
86
+ })
87
+ );
88
+ }
89
+
90
+ protected _verifyHasSources(sources: ProviderMediaConfigSourcesObject): void {
91
+ if (sources.hls.concat(sources.dash, sources.progressive, sources.image).length === 0) {
92
+ throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {
93
+ action: '',
94
+ messages: `No play source for entry id: ${sources.id}`
95
+ });
96
+ }
97
+ }
98
+
99
+ public get LogLevel(): LogLevelType {
100
+ return LogLevel;
101
+ }
102
+
103
+ public getLogLevel(name?: string): any {
104
+ return getLogLevel(name);
105
+ }
106
+
107
+ public setLogLevel(level: any, name?: string): void {
108
+ setLogLevel(level, name);
109
+ }
110
+ }
111
+
112
+ export {BaseProvider}
@@ -0,0 +1,56 @@
1
+ export default class ServiceResult {
2
+ /**
3
+ * @member - Is service returned an error
4
+ * @type {boolean}
5
+ */
6
+ public hasError: boolean = false;
7
+ /**
8
+ * @member - The service error
9
+ * @type {ServiceError}
10
+ */
11
+ public error!: ServiceError;
12
+ /**
13
+ * @member - The service result data
14
+ * @type {Object}
15
+ */
16
+ public data: any;
17
+
18
+ /**
19
+ * @constructor
20
+ * @param {Object} response - Service response
21
+ */
22
+ constructor(response: any) {
23
+ if (response.objectType === 'KalturaAPIException') {
24
+ this.hasError = true;
25
+ this.error = new ServiceError(response.code, response.message);
26
+ } else if (response.error && response.error.objectType === 'KalturaAPIException') {
27
+ this.hasError = true;
28
+ this.error = new ServiceError(response.error.code, response.error.message);
29
+ } else {
30
+ this.data = response;
31
+ }
32
+ }
33
+ }
34
+
35
+ class ServiceError {
36
+ /**
37
+ * @member - The error code
38
+ * @type {string}
39
+ */
40
+ public code: string;
41
+ /**
42
+ * @member - The error message
43
+ * @type {string}
44
+ */
45
+ public message: string;
46
+
47
+ /**
48
+ * @constructor
49
+ * @param {string} code - The result code
50
+ * @param {string} message - The result message
51
+ */
52
+ constructor(code: string, message: string) {
53
+ this.code = code;
54
+ this.message = message;
55
+ }
56
+ }
@@ -0,0 +1,115 @@
1
+ import MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';
2
+ import Error from '../../util/error/error';
3
+ import {ILoader, ProviderNetworkRetryParameters} from '../../types';
4
+
5
+ export default class DataLoaderManager {
6
+ /**
7
+ * @member - Loaders response map index
8
+ * @type {Map<string,Array<number>>}
9
+ * @private
10
+ */
11
+ private _loadersResponseMap: Map<string, Array<number>> = new Map();
12
+ /**
13
+ * @member - Loaders multi request
14
+ * @type {MultiRequestBuilder}
15
+ * @protected
16
+ */
17
+ protected _multiRequest!: MultiRequestBuilder;
18
+ /**
19
+ * @member - Loaders multi response
20
+ * @type {MultiRequestResult}
21
+ * @private
22
+ */
23
+ private _multiResponse!: MultiRequestResult;
24
+ /**
25
+ * @member - Loaders to execute
26
+ * @type {Map<string,Function>}
27
+ * @private
28
+ */
29
+ private _loaders: Map<string, ILoader> = new Map();
30
+
31
+ private _networkRetryConfig: ProviderNetworkRetryParameters;
32
+
33
+ constructor(networkRetryConfig: ProviderNetworkRetryParameters) {
34
+ this._networkRetryConfig = networkRetryConfig;
35
+ }
36
+
37
+ /**
38
+ * Add loader to execution loaders map
39
+ * @function
40
+ * @param {Function} loader Loader to add
41
+ * @param {Object} params Loader params
42
+ * @param {string} ks ks
43
+ * @returns {void}
44
+ */
45
+ public add(loader: {new(...params): ILoader, id: string}, params: any, ks?: string): void {
46
+ const execution_loader = new loader(params);
47
+ if (execution_loader.isValid()) {
48
+ this._loaders.set(loader.id, execution_loader);
49
+ // Get the start index from the multiReqeust before adding current execution_loader requests
50
+ const startIndex = this._multiRequest.requests.length;
51
+ // Get the requests
52
+ const requests = execution_loader.requests;
53
+ this._multiRequest.retryConfig = this._networkRetryConfig;
54
+ // Add requests to multiRequest queue
55
+ requests.forEach(request => {
56
+ request.params = request.params || {};
57
+ request.params.ks = request.params.ks || ks;
58
+ this._multiRequest.add(request);
59
+ });
60
+ // Create range array of current execution_loader requests
61
+ const executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);
62
+ // Add to map
63
+ this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Get data from all loaders using multi request
69
+ * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not
70
+ * @function
71
+ * @returns {Promise} Promise
72
+ */
73
+ public fetchData(requestsMustSucceed?: boolean): Promise<any> {
74
+ return new Promise((resolve, reject) => {
75
+ this._multiRequest.execute(requestsMustSucceed).then(
76
+ data => {
77
+ this._multiResponse = data.response;
78
+ const preparedData: any = this.prepareData(data.response);
79
+ if (preparedData.success) {
80
+ resolve(this._loaders);
81
+ } else {
82
+ reject(
83
+ new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {
84
+ headers: data.headers
85
+ })
86
+ );
87
+ }
88
+ },
89
+ err => {
90
+ reject(err);
91
+ }
92
+ );
93
+ });
94
+ }
95
+
96
+ /**
97
+ * Prepare fetched data
98
+ * @function
99
+ * @param {MultiRequestResult} response - The multi request result
100
+ * @returns {Object} - The prepared data
101
+ */
102
+ public prepareData(response: MultiRequestResult): any {
103
+ this._loaders.forEach((loader, name) => {
104
+ const loaderDataIndexes = this._loadersResponseMap.get(name);
105
+ try {
106
+ if (loaderDataIndexes && loaderDataIndexes.length > 0) {
107
+ loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);
108
+ }
109
+ } catch (err) {
110
+ return {success: false, error: err};
111
+ }
112
+ });
113
+ return {success: true, data: this._loaders};
114
+ }
115
+ }