Source: lib/offline/offline_scheme.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.offline.OfflineScheme');
  7. goog.require('goog.asserts');
  8. goog.require('shaka.net.NetworkingEngine');
  9. goog.require('shaka.offline.OfflineUri');
  10. goog.require('shaka.offline.StorageMuxer');
  11. goog.require('shaka.util.AbortableOperation');
  12. goog.require('shaka.util.Error');
  13. /**
  14. * @summary A plugin that handles requests for offline content.
  15. * @export
  16. */
  17. shaka.offline.OfflineScheme = class {
  18. /**
  19. * @param {string} uri
  20. * @param {shaka.extern.Request} request
  21. * @param {shaka.net.NetworkingEngine.RequestType} requestType
  22. * @param {shaka.extern.ProgressUpdated} progressUpdated Called when a
  23. * progress event happened.
  24. * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}
  25. * @export
  26. */
  27. static plugin(uri, request, requestType, progressUpdated) {
  28. const offlineUri = shaka.offline.OfflineUri.parse(uri);
  29. if (offlineUri && offlineUri.isManifest()) {
  30. return shaka.offline.OfflineScheme.getManifest_(uri);
  31. }
  32. if (offlineUri && offlineUri.isSegment()) {
  33. return shaka.offline.OfflineScheme.getSegment_(
  34. offlineUri.key(), offlineUri);
  35. }
  36. return shaka.util.AbortableOperation.failed(
  37. new shaka.util.Error(
  38. shaka.util.Error.Severity.CRITICAL,
  39. shaka.util.Error.Category.NETWORK,
  40. shaka.util.Error.Code.MALFORMED_OFFLINE_URI,
  41. uri));
  42. }
  43. /**
  44. * @param {string} uri
  45. * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}
  46. * @private
  47. */
  48. static getManifest_(uri) {
  49. /** @type {shaka.extern.Response} */
  50. const response = {
  51. uri: uri,
  52. originalUri: uri,
  53. data: new ArrayBuffer(0),
  54. headers: {'content-type': 'application/x-offline-manifest'},
  55. };
  56. return shaka.util.AbortableOperation.completed(response);
  57. }
  58. /**
  59. * @param {number} id
  60. * @param {!shaka.offline.OfflineUri} uri
  61. * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}
  62. * @private
  63. */
  64. static getSegment_(id, uri) {
  65. goog.asserts.assert(
  66. uri.isSegment(),
  67. 'Only segment uri\'s should be given to getSegment');
  68. /** @type {!shaka.offline.StorageMuxer} */
  69. const muxer = new shaka.offline.StorageMuxer();
  70. return shaka.util.AbortableOperation.completed(undefined)
  71. .chain(() => muxer.init())
  72. .chain(() => muxer.getCell(uri.mechanism(), uri.cell()))
  73. .chain((cell) => cell.getSegments([uri.key()]))
  74. .chain((segments) => {
  75. const segment = segments[0];
  76. return {
  77. uri: uri,
  78. data: segment.data,
  79. headers: {},
  80. };
  81. })
  82. .finally(() => muxer.destroy());
  83. }
  84. };
  85. shaka.net.NetworkingEngine.registerScheme(
  86. 'offline', shaka.offline.OfflineScheme.plugin);