| 'use strict'; |
| |
| var toStr = Object.prototype.toString; |
| var fnToStr = Function.prototype.toString; |
| var isFnRegex = /^\s*async(?:\s+function(?:\s+|\()|\s*\()/; |
| var hasToStringTag = require('has-tostringtag/shams')(); |
| var getProto = Object.getPrototypeOf; |
| var getAsyncFunc = function () { // eslint-disable-line consistent-return |
| if (!hasToStringTag) { |
| return false; |
| } |
| try { |
| return Function('return async function () {}')(); |
| } catch (e) { |
| } |
| }; |
| var AsyncFunction; |
| |
| module.exports = function isAsyncFunction(fn) { |
| if (typeof fn !== 'function') { |
| return false; |
| } |
| if (isFnRegex.test(fnToStr.call(fn))) { |
| return true; |
| } |
| if (!hasToStringTag) { |
| var str = toStr.call(fn); |
| return str === '[object AsyncFunction]'; |
| } |
| if (!getProto) { |
| return false; |
| } |
| if (typeof AsyncFunction === 'undefined') { |
| var asyncFunc = getAsyncFunc(); |
| AsyncFunction = asyncFunc ? getProto(asyncFunc) : false; |
| } |
| return getProto(fn) === AsyncFunction; |
| }; |