autofill.ts 818 B

12345678910111213141516171819202122232425262728293031323334
  1. import { IFormFillData } from '~/interfaces';
  2. import { makeId } from '~/utils/string';
  3. const passwords: Map<string, string> = new Map();
  4. export const getUserPassword = (data: IFormFillData): Promise<string> => {
  5. return new Promise((resolve) => {
  6. const { url, fields } = data;
  7. const account = `${url}-${fields.username}`;
  8. const password = passwords.get(account);
  9. if (password) return resolve(password);
  10. const id = makeId(32);
  11. window.postMessage(
  12. {
  13. type: 'credentials-get-password',
  14. data: account,
  15. id,
  16. },
  17. '*',
  18. );
  19. window.addEventListener('message', (e) => {
  20. const { data } = e;
  21. if (data.type === 'result' && data.id === id) {
  22. passwords.set(account, data.result);
  23. resolve(data.result);
  24. }
  25. });
  26. });
  27. };