@playkit-js/playkit-js-providers 2.39.1 → 2.39.2

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 (130) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/playkit-analytics-service.js +2 -0
  3. package/dist/playkit-analytics-service.js.map +1 -0
  4. package/dist/playkit-bookmark-service.js +2 -0
  5. package/dist/playkit-bookmark-service.js.map +1 -0
  6. package/dist/playkit-ott-provider.js +2 -0
  7. package/dist/playkit-ott-provider.js.map +1 -0
  8. package/dist/playkit-ovp-provider.js +2 -0
  9. package/dist/playkit-ovp-provider.js.map +1 -0
  10. package/dist/playkit-stats-service.js +2 -0
  11. package/dist/playkit-stats-service.js.map +1 -0
  12. package/package.json +1 -1
  13. package/.babelrc +0 -22
  14. package/.editorconfig +0 -10
  15. package/.eslintignore +0 -3
  16. package/.eslintrc.json +0 -26
  17. package/.flowconfig +0 -5
  18. package/.github/ISSUE_TEMPLATE.md +0 -28
  19. package/.github/PULL_REQUEST_TEMPLATE.md +0 -12
  20. package/.github/workflows/run_canary_full_flow.yaml +0 -28
  21. package/.github/workflows/run_prod.yaml +0 -24
  22. package/.github/workflows/run_tests.yaml +0 -24
  23. package/.prettierignore +0 -7
  24. package/.prettierrc +0 -12
  25. package/docs/configuration.md +0 -225
  26. package/karma.conf.js +0 -42
  27. package/src/entities/bumper.js +0 -23
  28. package/src/entities/drm.js +0 -46
  29. package/src/entities/entry-list.js +0 -15
  30. package/src/entities/image-source.js +0 -37
  31. package/src/entities/media-entry.js +0 -96
  32. package/src/entities/media-format.js +0 -46
  33. package/src/entities/media-source.js +0 -70
  34. package/src/entities/media-sources.js +0 -79
  35. package/src/entities/playlist.js +0 -37
  36. package/src/index.html +0 -11
  37. package/src/k-provider/common/base-provider-parser.js +0 -0
  38. package/src/k-provider/common/base-provider.js +0 -110
  39. package/src/k-provider/common/base-service-result.js +0 -57
  40. package/src/k-provider/common/data-loader-manager.js +0 -115
  41. package/src/k-provider/common/multi-request-builder.js +0 -112
  42. package/src/k-provider/common/response-types/kaltura-access-control-message.js +0 -22
  43. package/src/k-provider/common/response-types/kaltura-drm-playback-plugin-data.js +0 -39
  44. package/src/k-provider/ott/config.js +0 -22
  45. package/src/k-provider/ott/index.js +0 -15
  46. package/src/k-provider/ott/loaders/asset-list-loader.js +0 -68
  47. package/src/k-provider/ott/loaders/asset-loader.js +0 -69
  48. package/src/k-provider/ott/loaders/data-loader-manager.js +0 -15
  49. package/src/k-provider/ott/loaders/session-loader.js +0 -62
  50. package/src/k-provider/ott/provider-parser.js +0 -282
  51. package/src/k-provider/ott/provider.js +0 -242
  52. package/src/k-provider/ott/response-types/kaltura-asset.js +0 -79
  53. package/src/k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.js +0 -28
  54. package/src/k-provider/ott/response-types/kaltura-playback-context.js +0 -74
  55. package/src/k-provider/ott/response-types/kaltura-playback-source.js +0 -63
  56. package/src/k-provider/ott/response-types/kaltura-rule-action.js +0 -26
  57. package/src/k-provider/ott/services/asset-service.js +0 -50
  58. package/src/k-provider/ott/services/bookmark/bookmark-service.js +0 -49
  59. package/src/k-provider/ott/services/bookmark/index.js +0 -12
  60. package/src/k-provider/ott/services/ott-service.js +0 -34
  61. package/src/k-provider/ott/services/user-service.js +0 -32
  62. package/src/k-provider/ovp/config.js +0 -28
  63. package/src/k-provider/ovp/external-captions-builder.js +0 -38
  64. package/src/k-provider/ovp/index.js +0 -13
  65. package/src/k-provider/ovp/loaders/data-loader-manager.js +0 -17
  66. package/src/k-provider/ovp/loaders/entry-list-loader.js +0 -69
  67. package/src/k-provider/ovp/loaders/media-entry-loader.js +0 -84
  68. package/src/k-provider/ovp/loaders/playlist-loader.js +0 -66
  69. package/src/k-provider/ovp/loaders/session-loader.js +0 -62
  70. package/src/k-provider/ovp/loaders/ui-config-loader.js +0 -71
  71. package/src/k-provider/ovp/play-source-url-builder.js +0 -60
  72. package/src/k-provider/ovp/provider-parser.js +0 -451
  73. package/src/k-provider/ovp/provider.js +0 -344
  74. package/src/k-provider/ovp/regex-action-handler.js +0 -147
  75. package/src/k-provider/ovp/request-params/base-entry-response-profile.js +0 -29
  76. package/src/k-provider/ovp/response-types/index.js +0 -18
  77. package/src/k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js +0 -36
  78. package/src/k-provider/ovp/response-types/kaltura-base-entry-list-response.js +0 -31
  79. package/src/k-provider/ovp/response-types/kaltura-bumper.js +0 -26
  80. package/src/k-provider/ovp/response-types/kaltura-flavor-asset.js +0 -109
  81. package/src/k-provider/ovp/response-types/kaltura-media-entries.js +0 -23
  82. package/src/k-provider/ovp/response-types/kaltura-media-entry.js +0 -141
  83. package/src/k-provider/ovp/response-types/kaltura-metadata-list-response.js +0 -23
  84. package/src/k-provider/ovp/response-types/kaltura-metadata.js +0 -51
  85. package/src/k-provider/ovp/response-types/kaltura-playback-context.js +0 -96
  86. package/src/k-provider/ovp/response-types/kaltura-playback-source.js +0 -90
  87. package/src/k-provider/ovp/response-types/kaltura-playlist.js +0 -35
  88. package/src/k-provider/ovp/response-types/kaltura-rule-action.js +0 -28
  89. package/src/k-provider/ovp/response-types/kaltura-ui-conf-response.js +0 -90
  90. package/src/k-provider/ovp/services/analytics/analytics-service.js +0 -57
  91. package/src/k-provider/ovp/services/analytics/index.js +0 -12
  92. package/src/k-provider/ovp/services/base-entry-service.js +0 -76
  93. package/src/k-provider/ovp/services/meta-data-service.js +0 -30
  94. package/src/k-provider/ovp/services/ovp-service.js +0 -33
  95. package/src/k-provider/ovp/services/playlist-service.js +0 -63
  96. package/src/k-provider/ovp/services/session-service.js +0 -28
  97. package/src/k-provider/ovp/services/stats/index.js +0 -12
  98. package/src/k-provider/ovp/services/stats/stats-service.js +0 -33
  99. package/src/k-provider/ovp/services/ui-conf-service.js +0 -33
  100. package/src/util/clone.js +0 -23
  101. package/src/util/error/category.js +0 -12
  102. package/src/util/error/code.js +0 -79
  103. package/src/util/error/error.js +0 -48
  104. package/src/util/error/severity.js +0 -23
  105. package/src/util/logger.js +0 -108
  106. package/src/util/param.js +0 -45
  107. package/src/util/request-builder.js +0 -187
  108. package/src/util/xml-parser.js +0 -40
  109. package/test/.eslintrc.json +0 -9
  110. package/test/setup/karma.js +0 -5
  111. package/test/setup/load-specs.js +0 -13
  112. package/test/setup/prepare-test-environment.js +0 -17
  113. package/test/src/k-provider/ott/be-data.js +0 -3306
  114. package/test/src/k-provider/ott/media-config-data.js +0 -793
  115. package/test/src/k-provider/ott/provider-parser.spec.js +0 -30
  116. package/test/src/k-provider/ott/provider.spec.js +0 -384
  117. package/test/src/k-provider/ott/services/bookmark-service.spec.js +0 -38
  118. package/test/src/k-provider/ovp/be-data.js +0 -3932
  119. package/test/src/k-provider/ovp/external-captions-builder.spec.js +0 -59
  120. package/test/src/k-provider/ovp/media-config-data.js +0 -1509
  121. package/test/src/k-provider/ovp/playback-sources-data.js +0 -229
  122. package/test/src/k-provider/ovp/provider-parser-data.js +0 -142
  123. package/test/src/k-provider/ovp/provider-parser.spec.js +0 -96
  124. package/test/src/k-provider/ovp/provider.spec.js +0 -1075
  125. package/test/src/k-provider/ovp/regex-action-handler-data.js +0 -794
  126. package/test/src/k-provider/ovp/regex-action-handler.spec.js +0 -93
  127. package/test/src/k-provider/ovp/services/analytics-service.spec.js +0 -62
  128. package/test/src/k-provider/ovp/services/stats-service.spec.js +0 -37
  129. package/test/src/util/param.spec.js +0 -23
  130. package/webpack.config.js +0 -85
@@ -1,344 +0,0 @@
1
- //@flow
2
- import getLogger from '../../util/logger';
3
- import OVPConfiguration from './config';
4
- import OVPProviderParser from './provider-parser';
5
- import {KalturaMediaEntry} from './response-types/kaltura-media-entry';
6
- import OVPMediaEntryLoader from './loaders/media-entry-loader';
7
- import OVPSessionLoader from './loaders/session-loader';
8
- import OVPDataLoaderManager from './loaders/data-loader-manager';
9
- import OVPPlaylistLoader from './loaders/playlist-loader';
10
- import BaseProvider from '../common/base-provider';
11
- import MediaEntry from '../../entities/media-entry';
12
- import OVPEntryListLoader from './loaders/entry-list-loader';
13
- import Error from '../../util/error/error';
14
- import RegexActionHandler from './regex-action-handler';
15
-
16
- export default class OVPProvider extends BaseProvider<OVPProviderMediaInfoObject> {
17
- _filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};
18
- /**
19
- * @constructor
20
- * @param {ProviderOptionsObject} options - provider options
21
- * @param {string} playerVersion - player version
22
- */
23
- constructor(options: ProviderOptionsObject, playerVersion: string) {
24
- super(options, playerVersion);
25
- this._logger = getLogger('OVPProvider');
26
- OVPConfiguration.set(options.env);
27
- this._setFilterOptionsConfig(options.filterOptions);
28
- this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);
29
- }
30
-
31
- get env() {
32
- return OVPConfiguration.get();
33
- }
34
-
35
- /**
36
- * Gets the backend media config.
37
- * @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info
38
- * @returns {Promise<ProviderMediaConfigObject>} - The provider media config
39
- */
40
- getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise<ProviderMediaConfigObject> {
41
- if (mediaInfo.ks) {
42
- this.ks = mediaInfo.ks;
43
- this._isAnonymous = false;
44
- }
45
- if (this.widgetId !== this.defaultWidgetId) {
46
- this._isAnonymous = false;
47
- }
48
- this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
49
- return new Promise((resolve, reject) => {
50
- const entryId = mediaInfo.entryId;
51
- const referenceId = mediaInfo.referenceId;
52
- if (entryId || referenceId) {
53
- let ks: string = this.ks;
54
- if (!ks) {
55
- ks = '{1:result:ks}';
56
- this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
57
- }
58
- const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);
59
- this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});
60
- return this._dataLoader.fetchData().then(
61
- response => {
62
- try {
63
- const mediaConfig = this._parseDataFromResponse(response);
64
- RegexActionHandler.handleRegexAction(mediaConfig, response).then(resolve);
65
- } catch (err) {
66
- reject(err);
67
- }
68
- },
69
- err => {
70
- reject(err);
71
- }
72
- );
73
- } else {
74
- reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));
75
- }
76
- });
77
- }
78
-
79
- doRequest(loaders: Array<RequestLoader>, ks?: string): Promise<any> {
80
- let theKs: string = ks || this.ks;
81
- const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);
82
-
83
- return new Promise((resolve, reject) => {
84
- if (!theKs) {
85
- dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
86
- }
87
- loaders.forEach((loaderRequest: RequestLoader) => {
88
- dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');
89
- });
90
- return dataLoader.fetchData().then(
91
- response => {
92
- try {
93
- resolve(response);
94
- } catch (err) {
95
- reject(err);
96
- }
97
- },
98
- err => {
99
- reject(err);
100
- }
101
- );
102
- });
103
- }
104
-
105
- _getEntryRedirectFilter(mediaInfo: Object): boolean {
106
- return typeof mediaInfo.redirectFromEntryId === 'boolean'
107
- ? mediaInfo.redirectFromEntryId
108
- : typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'
109
- ? this._filterOptionsConfig.redirectFromEntryId
110
- : true;
111
- }
112
-
113
- _setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {
114
- if (options && typeof options.redirectFromEntryId == 'boolean') {
115
- this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;
116
- }
117
- }
118
-
119
- _parseDataFromResponse(data: Map<string, Function>): ProviderMediaConfigObject {
120
- this._logger.debug('Data parsing started');
121
- const mediaConfig: ProviderMediaConfigObject = {
122
- session: {
123
- isAnonymous: this._isAnonymous,
124
- partnerId: this.partnerId
125
- },
126
- sources: this._getDefaultSourcesObject(),
127
- plugins: {}
128
- };
129
-
130
- if (this.uiConfId) {
131
- mediaConfig.session.uiConfId = this.uiConfId;
132
- }
133
-
134
- if (data) {
135
- if (data.has(OVPSessionLoader.id)) {
136
- const sessionLoader = data.get(OVPSessionLoader.id);
137
- if (sessionLoader && sessionLoader.response) {
138
- mediaConfig.session.ks = sessionLoader.response;
139
- if (this.widgetId !== this.defaultWidgetId) {
140
- this.ks = mediaConfig.session.ks;
141
- }
142
- }
143
- } else {
144
- mediaConfig.session.ks = this.ks;
145
- }
146
- if (data.has(OVPMediaEntryLoader.id)) {
147
- const mediaLoader = data.get(OVPMediaEntryLoader.id);
148
- if (mediaLoader && mediaLoader.response) {
149
- const response = (mediaLoader: OVPMediaEntryLoader).response;
150
- if (OVPProviderParser.hasBlockAction(response)) {
151
- throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {
152
- action: OVPProviderParser.getBlockAction(response),
153
- messages: OVPProviderParser.getErrorMessages(response)
154
- });
155
- }
156
- const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);
157
- Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));
158
- this._verifyMediaStatus(mediaEntry);
159
- this._verifyHasSources(mediaConfig.sources);
160
- const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);
161
- if (bumper) {
162
- Object.assign(mediaConfig.plugins, {bumper});
163
- }
164
- }
165
- }
166
- }
167
- this._logger.debug('Data parsing finished', mediaConfig);
168
- return mediaConfig;
169
- }
170
-
171
- /**
172
- * Checks if media is ready for playback (not being imported or converted)
173
- * @param {MediaEntry} mediaEntry - the media entry info
174
- * @returns {void}
175
- */
176
- _verifyMediaStatus(mediaEntry: MediaEntry) {
177
- if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {
178
- throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {
179
- messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,
180
- data: {status}
181
- });
182
- }
183
- }
184
- /**
185
- * Gets the backend playlist config.
186
- * @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info
187
- * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config
188
- */
189
- getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {
190
- if (playlistInfo.ks) {
191
- this.ks = playlistInfo.ks;
192
- this._isAnonymous = false;
193
- }
194
- if (this.widgetId !== this.defaultWidgetId) {
195
- this._isAnonymous = false;
196
- }
197
- this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
198
- return new Promise((resolve, reject) => {
199
- const playlistId = playlistInfo.playlistId;
200
- if (playlistId) {
201
- let ks: string = this.ks;
202
- if (!ks) {
203
- ks = '{1:result:ks}';
204
- this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
205
- }
206
- this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});
207
- this._dataLoader.fetchData().then(
208
- response => {
209
- resolve(this._parsePlaylistDataFromResponse(response));
210
- },
211
- err => {
212
- reject(err);
213
- }
214
- );
215
- } else {
216
- reject({success: false, data: 'Missing mandatory parameter'});
217
- }
218
- });
219
- }
220
-
221
- _parsePlaylistDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {
222
- this._logger.debug('Data parsing started');
223
- const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();
224
- if (data && data.has(OVPPlaylistLoader.id)) {
225
- const playlistLoader = data.get(OVPPlaylistLoader.id);
226
- if (playlistLoader && playlistLoader.response) {
227
- const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);
228
- playlistConfig.id = playlist.id;
229
- playlistConfig.poster = playlist.poster;
230
- playlistConfig.metadata.name = playlist.name;
231
- playlistConfig.metadata.description = playlist.description;
232
- playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));
233
- }
234
- }
235
- this._logger.debug('Data parsing finished', playlistConfig);
236
- return playlistConfig;
237
- }
238
-
239
- /**
240
- * Gets playlist config from entry list.
241
- * @param {ProviderEntryListObject} entryListInfo - ovp entry list info
242
- * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config
243
- */
244
- getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {
245
- if (entryListInfo.ks) {
246
- this.ks = entryListInfo.ks;
247
- this._isAnonymous = false;
248
- }
249
- if (this.widgetId !== this.defaultWidgetId) {
250
- this._isAnonymous = false;
251
- }
252
- this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
253
- return new Promise((resolve, reject) => {
254
- const entries = entryListInfo.entries;
255
- if (entries && entries.length) {
256
- let ks: string = this.ks;
257
- if (!ks) {
258
- ks = '{1:result:ks}';
259
- this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
260
- }
261
- const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);
262
- this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});
263
- this._dataLoader.fetchData(false).then(
264
- response => {
265
- resolve(this._parseEntryListDataFromResponse(response));
266
- },
267
- err => {
268
- reject(err);
269
- }
270
- );
271
- } else {
272
- reject({success: false, data: 'Missing mandatory parameter'});
273
- }
274
- });
275
- }
276
-
277
- _parseEntryListDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {
278
- this._logger.debug('Data parsing started');
279
- const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();
280
- if (data && data.has(OVPEntryListLoader.id)) {
281
- const playlistLoader = data.get(OVPEntryListLoader.id);
282
- if (playlistLoader && playlistLoader.response) {
283
- const entryList = OVPProviderParser.getEntryList(playlistLoader.response);
284
- entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));
285
- }
286
- }
287
- this._logger.debug('Data parsing finished', playlistConfig);
288
- return playlistConfig;
289
- }
290
-
291
- _getPlaylistObject(): ProviderPlaylistObject {
292
- return {
293
- id: '',
294
- metadata: {
295
- name: '',
296
- description: ''
297
- },
298
- poster: '',
299
- items: []
300
- };
301
- }
302
-
303
- _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {
304
- return {
305
- hls: [],
306
- dash: [],
307
- progressive: [],
308
- image: [],
309
- id: '',
310
- duration: 0,
311
- type: MediaEntry.Type.UNKNOWN,
312
- poster: '',
313
- dvr: false,
314
- vr: null,
315
- metadata: {
316
- name: '',
317
- description: '',
318
- tags: ''
319
- }
320
- };
321
- }
322
-
323
- _getSourcesObject(mediaEntry: MediaEntry) {
324
- const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();
325
- const mediaSources = mediaEntry.sources.toJSON();
326
- sourcesObject.hls = mediaSources.hls;
327
- sourcesObject.dash = mediaSources.dash;
328
- sourcesObject.progressive = mediaSources.progressive;
329
- sourcesObject.image = mediaSources.image;
330
- sourcesObject.id = mediaEntry.id;
331
- sourcesObject.duration = mediaEntry.duration;
332
- sourcesObject.type = mediaEntry.type;
333
- sourcesObject.dvr = !!mediaEntry.dvrStatus;
334
- sourcesObject.poster = mediaEntry.poster;
335
- if (mediaEntry.sources.captions) {
336
- sourcesObject.captions = mediaEntry.sources.captions;
337
- }
338
- if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.search(/\b360\b/) > -1) {
339
- sourcesObject.vr = {};
340
- }
341
- Object.assign(sourcesObject.metadata, mediaEntry.metadata);
342
- return sourcesObject;
343
- }
344
- }
@@ -1,147 +0,0 @@
1
- //@flow
2
- import getLogger from '../../util/logger';
3
- import OVPConfiguration from './config';
4
- import {KalturaAccessControlModifyRequestHostRegexAction} from './response-types';
5
- import OVPMediaEntryLoader from './loaders/media-entry-loader';
6
-
7
- class RegexActionHandler {
8
- static _logger = getLogger('RegexActionHandler');
9
-
10
- /**
11
- * Applies the request host regex on the url
12
- * @function _applyRegexAction
13
- * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
14
- * @param {string} url - The url to modify
15
- * @returns {string} - The request host regex applied url
16
- * @static
17
- * @private
18
- */
19
- static _applyRegexAction(regexAction: KalturaAccessControlModifyRequestHostRegexAction, url: string): string {
20
- if (regexAction) {
21
- const regex = new RegExp(regexAction.pattern, 'i');
22
- if (url.match(regex)) {
23
- return url.replace(regex, regexAction.replacement + '/');
24
- }
25
- }
26
- return url;
27
- }
28
-
29
- /**
30
- * Ping the ECDN url to check if alive
31
- * @function _pingECDNUrl
32
- * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
33
- * @param {string} cdnUrl - The CDN url
34
- * @returns {Promise<boolean>} - Whether the media config sources urls should be modified or not
35
- * @static
36
- * @private
37
- */
38
- static async _isECDNUrlAlive(regexAction: KalturaAccessControlModifyRequestHostRegexAction, cdnUrl: string) {
39
- const urlPing = cdnUrl + '/api_v3/service/system/action/ping/format/1';
40
- const req = new XMLHttpRequest();
41
- req.open('GET', urlPing);
42
- req.timeout = regexAction.checkAliveTimeoutMs;
43
- req.onreadystatechange = () => {
44
- if (req.readyState === 4) {
45
- if (req.status === 200) {
46
- return true;
47
- }
48
- return false;
49
- }
50
- };
51
- req.ontimeout = () => {
52
- RegexActionHandler._logger.warn(`Got timeout while pinging the ECDN url. the ping url: ${urlPing}`);
53
- return false;
54
- };
55
- req.send();
56
- }
57
-
58
- /**
59
- * Handles regex action
60
- * @function handleRegexAction
61
- * @param {ProviderMediaConfigObject} mediaConfig - The media config
62
- * @param {Map<string, Function>} rawResponse - The raw response data from backend
63
- * @returns {Promise<ProviderMediaConfigObject>} - The media config with old or modified urls
64
- * @static
65
- */
66
- static async handleRegexAction(mediaConfig: ProviderMediaConfigObject, rawResponse: Map<string, Function>): Promise<ProviderMediaConfigObject> {
67
- let cdnUrl = OVPConfiguration.get().cdnUrl;
68
- const regexAction = RegexActionHandler._extractRegexActionFromData(rawResponse);
69
- const regExp = RegexActionHandler._getRegExp(regexAction);
70
-
71
- if (
72
- cdnUrl &&
73
- regexAction &&
74
- regExp &&
75
- cdnUrl.match(regExp) &&
76
- // we need to make the replacement in all cases except for when the checkAliveTimeoutMs > 0 && the ping has failed
77
- !(
78
- regexAction.checkAliveTimeoutMs > 0 &&
79
- !(await RegexActionHandler._isECDNUrlAlive(regexAction, cdnUrl.replace(regExp, regexAction.replacement)))
80
- )
81
- ) {
82
- RegexActionHandler._replaceHostUrls(mediaConfig, regexAction);
83
- return mediaConfig;
84
- }
85
-
86
- RegexActionHandler._logger.debug('exiting handleRegexAction - not applying regex action.');
87
- return mediaConfig;
88
- }
89
-
90
- /**
91
- * Modify the host urls - injects the configured cdn before the original host, to route requests
92
- * @function _replaceHostUrls
93
- * @param {ProviderMediaConfigObject} mediaConfig - The media config
94
- * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
95
- * @returns {void}
96
- * @static
97
- * @private
98
- */
99
- static _replaceHostUrls(mediaConfig: ProviderMediaConfigObject, regexAction: KalturaAccessControlModifyRequestHostRegexAction) {
100
- RegexActionHandler._logger.debug(`Starting to modify urls...`);
101
- const sources = mediaConfig.sources;
102
- const {hls, dash, progressive, image} = sources;
103
-
104
- [...hls, ...dash, ...progressive, ...image].forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));
105
-
106
- if (!OVPConfiguration.get().replaceHostOnlyManifestUrls) {
107
- RegexActionHandler._logger.debug(`replaceHostOnlyManifestUrls flag is off - modifying captions and poster URLs`);
108
- if (sources.captions) {
109
- sources.captions.forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));
110
- }
111
-
112
- // fix flow - poster can also be an array, but only for ott.
113
- if (typeof sources.poster === 'string') {
114
- sources.poster = RegexActionHandler._applyRegexAction(regexAction, sources.poster);
115
- }
116
- }
117
- RegexActionHandler._logger.debug(`Finished modifying urls`);
118
- }
119
-
120
- /**
121
- * Extracts the regex action from the data response
122
- * @function _extractRegexActionFromData
123
- * @param {Map<string, Function>} data - The response data
124
- * @returns {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
125
- * @static
126
- * @private
127
- */
128
- static _extractRegexActionFromData(data: Map<string, Function>): ?KalturaAccessControlModifyRequestHostRegexAction {
129
- return data.get(OVPMediaEntryLoader.id)?.response?.playBackContextResult.getRequestHostRegexAction();
130
- }
131
-
132
- /**
133
- * Extracts the regex action from the data response
134
- * @function _extractRegexActionFromData
135
- * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
136
- * @returns {RegExp} The regex expression
137
- * @static
138
- * @private
139
- */
140
- static _getRegExp(regexAction: KalturaAccessControlModifyRequestHostRegexAction): ?RegExp {
141
- if (regexAction && regexAction.pattern && regexAction.replacement) {
142
- return new RegExp(regexAction.pattern, 'i');
143
- }
144
- }
145
- }
146
-
147
- export default RegexActionHandler;
@@ -1,29 +0,0 @@
1
- //@flow
2
- const FIELDS =
3
- 'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status';
4
- const RESPONSE_PROFILE_TYPE = {
5
- INCLUDE_FIELDS: 1,
6
- EXCLUDE_FIELDS: 2
7
- };
8
- export class BaseEntryResponseProfile {
9
- static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;
10
- /**
11
- * @member - the response profile type
12
- * @type {number}
13
- */
14
- type: number;
15
- /**
16
- * @member - Comma separated fields list to be included or excluded
17
- * @type {string}
18
- */
19
- fields: string;
20
-
21
- /**
22
- * @constructor
23
- * @param {Object} responseProfile -
24
- */
25
- constructor(responseProfile: Object = {}) {
26
- this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;
27
- this.fields = responseProfile.fields || FIELDS;
28
- }
29
- }
@@ -1,18 +0,0 @@
1
- import BaseServiceResult from '../../common/base-service-result';
2
-
3
- export {KalturaBaseEntryListResponse} from './kaltura-base-entry-list-response';
4
- export {KalturaMediaEntry} from './kaltura-media-entry';
5
- export {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';
6
- export {KalturaBumper} from './kaltura-bumper';
7
- export {KalturaFlavorAsset} from './kaltura-flavor-asset';
8
- export {KalturaMediaEntries} from './kaltura-media-entries';
9
- export {KalturaMetadata} from './kaltura-metadata';
10
- export {KalturaMetadataListResponse} from './kaltura-metadata-list-response';
11
- export {KalturaPlaybackContext} from './kaltura-playback-context';
12
- export {KalturaPlaybackSource} from './kaltura-playback-source';
13
- export {KalturaPlaylist} from './kaltura-playlist';
14
- export {KalturaRuleAction} from './kaltura-rule-action';
15
- export {KalturaUIConfResponse} from './kaltura-ui-conf-response';
16
- export {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';
17
- export {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';
18
- export {BaseServiceResult};
@@ -1,36 +0,0 @@
1
- //@flow
2
- import {KalturaRuleAction} from './kaltura-rule-action';
3
-
4
- export class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {
5
- /**
6
- * @member - Request host regex pattern
7
- * @type {string}
8
- */
9
- pattern: string;
10
- /**
11
- * @member - Request host regex replacement
12
- * @type {string}
13
- */
14
- replacement: string;
15
- /**
16
- * @member - serverNodeId to generate replacment host from
17
- * @type {number}
18
- */
19
- replacmenServerNodeId: number;
20
- /**
21
- * @member - checkAliveTimeout in milliseconds
22
- * @type {number}
23
- */
24
- checkAliveTimeoutMs: number;
25
- /**
26
- * @constructor
27
- * @param {Object} data - The response
28
- */
29
- constructor(data: Object) {
30
- super(data);
31
- this.pattern = data.pattern;
32
- this.replacement = data.replacement;
33
- this.replacmenServerNodeId = data.replacmenServerNodeId;
34
- this.checkAliveTimeoutMs = data.checkAliveTimeoutMs;
35
- }
36
- }
@@ -1,31 +0,0 @@
1
- //@flow
2
- import ServiceResult from '../../common/base-service-result';
3
- import {KalturaMediaEntry} from './kaltura-media-entry';
4
-
5
- export class KalturaBaseEntryListResponse extends ServiceResult {
6
- /**
7
- * @member - The total count
8
- * @type {number}
9
- */
10
- totalCount: number;
11
- /**
12
- * @member - The entries
13
- * @type {Array<KalturaMediaEntry>}
14
- */
15
- entries: Array<KalturaMediaEntry>;
16
-
17
- /**
18
- * @constructor
19
- * @param {Object} responseObj The json response
20
- */
21
- constructor(responseObj: Object) {
22
- super(responseObj);
23
- if (!this.hasError) {
24
- this.totalCount = responseObj.totalCount;
25
- if (this.totalCount > 0) {
26
- this.entries = [];
27
- responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));
28
- }
29
- }
30
- }
31
- }
@@ -1,26 +0,0 @@
1
- //@flow
2
- import {KalturaPlaybackSource} from './kaltura-playback-source';
3
-
4
- export class KalturaBumper {
5
- /**
6
- * @member - The bumper entry ID
7
- * @type {string}
8
- */
9
- entryId: string;
10
- /**
11
- * @member - The bumper click through url
12
- * @type {string}
13
- */
14
- clickThroughUrl: string;
15
- /**
16
- * @member - The bumper sources
17
- * @type {Array<KalturaPlaybackSource>}
18
- */
19
- sources: Array<KalturaPlaybackSource>;
20
-
21
- constructor(data: any) {
22
- this.entryId = data.entryId;
23
- this.clickThroughUrl = data.url;
24
- this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];
25
- }
26
- }