VK: Hide Typing

look @name

As of 2021-04-26. See the latest version.

// ==UserScript==
// @name           VK: Hide Typing
// @name:ru        ВК: Скрыть набор текста
// @description    look @name
// @description:ru Смотри @name:ru
// @namespace      hidetyping.user.js
// @version        0.4
// @match          https://*.vk.com/*
// @exclude        https://im.vk.com/*
// @noframes
// ==/UserScript==

'use strict';

const PROXY = {
  XMLHttpRequest: () => {
    const _XMLHttpRequest = XMLHttpRequest.prototype;
    _XMLHttpRequest.send = new Proxy(_XMLHttpRequest.send, {
      apply(target, thisArg, argumentsList) {
        const [ query ] = argumentsList;
        if (/typing|audiomessage/.test(query)) return null;
        return Reflect.apply(target, thisArg, argumentsList);
      },
    });
  },
  fetch: () => {
    const _fetch = window.fetch;
    window.fetch = (input, init = {}) => {
      const _input = input.clone();
      return input
        .formData()
        .then((x) => [...x.values()].includes('typing'))
        .then((isTyping) =>
          isTyping ? new Promise(() => null) : _fetch(_input, init)
        );
    };
  },
};

const IS_MOBILE = new RegExp(/m.vk.com/);

const { href } = location;

const TYPE_PROXY = IS_MOBILE.test(href) ? 'fetch' : 'XMLHttpRequest';

const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.textContent = `(${PROXY[TYPE_PROXY].toString()})()`;
document.head.append(script);