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, request);
  31. }
  32. if (offlineUri && offlineUri.isSegment()) {
  33. return shaka.offline.OfflineScheme.getSegment_(
  34. offlineUri.key(), offlineUri, request);
  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. * @param {shaka.extern.Request} request
  46. * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}
  47. * @private
  48. */
  49. static getManifest_(uri, request) {
  50. /** @type {shaka.extern.Response} */
  51. const response = {
  52. uri: uri,
  53. originalUri: uri,
  54. data: new ArrayBuffer(0),
  55. headers: {'content-type': 'application/x-offline-manifest'},
  56. originalRequest: request,
  57. };
  58. return shaka.util.AbortableOperation.completed(response);
  59. }
  60. /**
  61. * @param {number} id
  62. * @param {!shaka.offline.OfflineUri} uri
  63. * @param {shaka.extern.Request} request
  64. * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}
  65. * @private
  66. */
  67. static getSegment_(id, uri, request) {
  68. goog.asserts.assert(
  69. uri.isSegment(),
  70. 'Only segment uri\'s should be given to getSegment');
  71. /** @type {!shaka.offline.StorageMuxer} */
  72. const muxer = new shaka.offline.StorageMuxer();
  73. return shaka.util.AbortableOperation.completed(undefined)
  74. .chain(() => muxer.init())
  75. .chain(() => muxer.getCell(uri.mechanism(), uri.cell()))
  76. .chain((cell) => cell.getSegments([uri.key()]))
  77. .chain((segments) => {
  78. const segment = segments[0];
  79. return {
  80. uri: uri,
  81. data: segment.data,
  82. headers: {},
  83. originalRequest: request,
  84. };
  85. })
  86. .finally(() => muxer.destroy());
  87. }
  88. };
  89. shaka.net.NetworkingEngine.registerScheme(
  90. 'offline', shaka.offline.OfflineScheme.plugin);