// Extremely small optimisation, reduces runtime prototype traversal const baseHasOwnProperty = Object.prototype.hasOwnProperty; /** @private */ export function isObject(val) { return typeof val === 'object' && val !== null; } /** @private */ export function isAsyncIterable(val) { return typeof Object(val)[Symbol.asyncIterator] === 'function'; } /** @private */ export function isAsyncGenerator(val) { return (isObject(val) && typeof Object(val)[Symbol.asyncIterator] === 'function' && typeof val.return === 'function' // for lazy ones, we only need the return anyway // typeof val.throw === 'function' && // typeof val.next === 'function' ); } /** @private */ export function areGraphQLErrors(obj) { return (Array.isArray(obj) && // must be at least one error obj.length > 0 && // error has at least a message obj.every((ob) => 'message' in ob)); } /** @private */ export function hasOwnProperty(obj, prop) { return baseHasOwnProperty.call(obj, prop); } /** @private */ export function hasOwnObjectProperty(obj, prop) { return baseHasOwnProperty.call(obj, prop) && isObject(obj[prop]); } /** @private */ export function hasOwnArrayProperty(obj, prop) { return baseHasOwnProperty.call(obj, prop) && Array.isArray(obj[prop]); } /** @private */ export function hasOwnStringProperty(obj, prop) { return baseHasOwnProperty.call(obj, prop) && typeof obj[prop] === 'string'; } /** * Limits the WebSocket close event reason to not exceed a length of one frame. * Reference: https://datatracker.ietf.org/doc/html/rfc6455#section-5.2. * * @private */ export function limitCloseReason(reason, whenTooLong) { return reason.length < 124 ? reason : whenTooLong; }