utils.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import DOMPurify from 'dompurify';
  2. import Storage from '@converse/skeletor/src/storage.js';
  3. import log from '@converse/headless/log';
  4. import { _converse, api } from '@converse/headless/core';
  5. import { getOpenPromise } from '@converse/openpromise';
  6. export function getDefaultStore () {
  7. if (_converse.config.get('trusted')) {
  8. const is_non_persistent = api.settings.get('persistent_store') === 'sessionStorage';
  9. return is_non_persistent ? 'session': 'persistent';
  10. } else {
  11. return 'session';
  12. }
  13. }
  14. function storeUsesIndexedDB (store) {
  15. return store === 'persistent' && api.settings.get('persistent_store') === 'IndexedDB';
  16. }
  17. export function createStore (id, store) {
  18. const name = store || getDefaultStore();
  19. const s = _converse.storage[name];
  20. if (typeof s === 'undefined') {
  21. throw new TypeError(`createStore: Could not find store for ${id}`);
  22. }
  23. return new Storage(id, s, storeUsesIndexedDB(store));
  24. }
  25. export function initStorage (model, id, type) {
  26. const store = type || getDefaultStore();
  27. model.browserStorage = _converse.createStore(id, store);
  28. if (storeUsesIndexedDB(store)) {
  29. const flush = () => model.browserStorage.flush();
  30. window.addEventListener(_converse.unloadevent, flush);
  31. model.on('destroy', () => window.removeEventListener(_converse.unloadevent, flush));
  32. model.listenTo(_converse, 'beforeLogout', flush);
  33. }
  34. }
  35. export function replacePromise (name) {
  36. const existing_promise = _converse.promises[name];
  37. if (!existing_promise) {
  38. throw new Error(`Tried to replace non-existing promise: ${name}`);
  39. }
  40. if (existing_promise.replace) {
  41. const promise = getOpenPromise();
  42. promise.replace = existing_promise.replace;
  43. _converse.promises[name] = promise;
  44. } else {
  45. log.debug(`Not replacing promise "${name}"`);
  46. }
  47. }
  48. const element = document.createElement('div');
  49. export function decodeHTMLEntities (str) {
  50. if (str && typeof str === 'string') {
  51. element.innerHTML = DOMPurify.sanitize(str);
  52. str = element.textContent;
  53. element.textContent = '';
  54. }
  55. return str;
  56. }