VK: Hide Typing

look @name

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name           VK: Hide Typing
// @name:ru        ВК: Скрыть набор текста
// @description    look @name
// @description:ru Смотри @name:ru
// @namespace      hidetyping.user.js
// @license        MIT
// @author         askornot
// @version        1.0.0
// @match          https://*.vk.com/*
// @compatible     chrome    Violentmonkey 2.12.7
// @compatible     firefox   Greasemonkey 4.11
// @compatible     firefox   Violentmonkey 2.12.14
// @compatible     firefox   Tampermonkey 4.12.6132
// @homepageURL    https://greasyfork.org/en/scripts/387887-vk-hide-typing
// @supportURL     https://greasyfork.org/en/scripts/387887-vk-hide-typing/feedback
// @noframes
// ==/UserScript==

'use strict';

const PROXY = {
  'vk.com': () => {
    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);
      },
    });
  },
  'm.vk.com': () => {
    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 { host } = location;

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