zone-patch-fetch.umd.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. 'use strict';
  2. /**
  3. * @license Angular v<unknown>
  4. * (c) 2010-2022 Google LLC. https://angular.io/
  5. * License: MIT
  6. */
  7. (function (factory) {
  8. typeof define === 'function' && define.amd ? define(factory) :
  9. factory();
  10. })((function () {
  11. 'use strict';
  12. /**
  13. * @fileoverview
  14. * @suppress {missingRequire}
  15. */
  16. Zone.__load_patch('fetch', function (global, Zone, api) {
  17. var fetch = global['fetch'];
  18. if (typeof fetch !== 'function') {
  19. return;
  20. }
  21. var originalFetch = global[api.symbol('fetch')];
  22. if (originalFetch) {
  23. // restore unpatched fetch first
  24. fetch = originalFetch;
  25. }
  26. var ZoneAwarePromise = global.Promise;
  27. var symbolThenPatched = api.symbol('thenPatched');
  28. var fetchTaskScheduling = api.symbol('fetchTaskScheduling');
  29. var fetchTaskAborting = api.symbol('fetchTaskAborting');
  30. var OriginalAbortController = global['AbortController'];
  31. var supportAbort = typeof OriginalAbortController === 'function';
  32. var abortNative = null;
  33. if (supportAbort) {
  34. global['AbortController'] = function () {
  35. var abortController = new OriginalAbortController();
  36. var signal = abortController.signal;
  37. signal.abortController = abortController;
  38. return abortController;
  39. };
  40. abortNative = api.patchMethod(OriginalAbortController.prototype, 'abort', function (delegate) { return function (self, args) {
  41. if (self.task) {
  42. return self.task.zone.cancelTask(self.task);
  43. }
  44. return delegate.apply(self, args);
  45. }; });
  46. }
  47. var placeholder = function () { };
  48. global['fetch'] = function () {
  49. var _this = this;
  50. var args = Array.prototype.slice.call(arguments);
  51. var options = args.length > 1 ? args[1] : null;
  52. var signal = options && options.signal;
  53. return new Promise(function (res, rej) {
  54. var task = Zone.current.scheduleMacroTask('fetch', placeholder, { fetchArgs: args }, function () {
  55. var fetchPromise;
  56. var zone = Zone.current;
  57. try {
  58. zone[fetchTaskScheduling] = true;
  59. fetchPromise = fetch.apply(_this, args);
  60. }
  61. catch (error) {
  62. rej(error);
  63. return;
  64. }
  65. finally {
  66. zone[fetchTaskScheduling] = false;
  67. }
  68. if (!(fetchPromise instanceof ZoneAwarePromise)) {
  69. var ctor = fetchPromise.constructor;
  70. if (!ctor[symbolThenPatched]) {
  71. api.patchThen(ctor);
  72. }
  73. }
  74. fetchPromise.then(function (resource) {
  75. if (task.state !== 'notScheduled') {
  76. task.invoke();
  77. }
  78. res(resource);
  79. }, function (error) {
  80. if (task.state !== 'notScheduled') {
  81. task.invoke();
  82. }
  83. rej(error);
  84. });
  85. }, function () {
  86. if (!supportAbort) {
  87. rej('No AbortController supported, can not cancel fetch');
  88. return;
  89. }
  90. if (signal && signal.abortController && !signal.aborted &&
  91. typeof signal.abortController.abort === 'function' && abortNative) {
  92. try {
  93. Zone.current[fetchTaskAborting] = true;
  94. abortNative.call(signal.abortController);
  95. }
  96. finally {
  97. Zone.current[fetchTaskAborting] = false;
  98. }
  99. }
  100. else {
  101. rej('cancel fetch need a AbortController.signal');
  102. }
  103. });
  104. if (signal && signal.abortController) {
  105. signal.abortController.task = task;
  106. }
  107. });
  108. };
  109. });
  110. }));