storage.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  3. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. define(["util"], function (util) {
  5. var assert = util.assert;
  6. var Deferred = util.Deferred;
  7. var DEFAULT_SETTINGS = {
  8. name: "",
  9. defaultName: "",
  10. avatar: null,
  11. stickyShare: null,
  12. color: null,
  13. seenIntroDialog: false,
  14. seenWalkthrough: false,
  15. dontShowRtcInfo: false
  16. };
  17. var DEBUG_STORAGE = false;
  18. var Storage = util.Class({
  19. constructor: function (name, storage, prefix) {
  20. this.name = name;
  21. this.storage = storage;
  22. this.prefix = prefix;
  23. },
  24. get: function (key, defaultValue) {
  25. var self = this;
  26. return Deferred(function (def) {
  27. // Strictly this isn't necessary, but eventually I want to move to something more
  28. // async for the storage, and this simulates that much better.
  29. setTimeout(util.resolver(def, function () {
  30. key = self.prefix + key;
  31. var value = self.storage.getItem(key);
  32. if (! value) {
  33. value = defaultValue;
  34. if (DEBUG_STORAGE) {
  35. console.debug("Get storage", key, "defaults to", value);
  36. }
  37. } else {
  38. value = JSON.parse(value);
  39. if (DEBUG_STORAGE) {
  40. console.debug("Get storage", key, "=", value);
  41. }
  42. }
  43. return value;
  44. }));
  45. });
  46. },
  47. set: function (key, value) {
  48. var self = this;
  49. if (value !== undefined) {
  50. value = JSON.stringify(value);
  51. }
  52. return Deferred(function (def) {
  53. key = self.prefix + key;
  54. if (value === undefined) {
  55. self.storage.removeItem(key);
  56. if (DEBUG_STORAGE) {
  57. console.debug("Delete storage", key);
  58. }
  59. } else {
  60. self.storage.setItem(key, value);
  61. if (DEBUG_STORAGE) {
  62. console.debug("Set storage", key, value);
  63. }
  64. }
  65. setTimeout(def.resolve);
  66. });
  67. },
  68. clear: function () {
  69. var self = this;
  70. var promises = [];
  71. return Deferred((function (def) {
  72. this.keys().then(function (keys) {
  73. keys.forEach(function (key) {
  74. // FIXME: technically we're ignoring the promise returned by all
  75. // these sets:
  76. promises.push(self.set(key, undefined));
  77. });
  78. util.resolveMany(promises).then(function () {
  79. def.resolve();
  80. });
  81. });
  82. }).bind(this));
  83. },
  84. keys: function (prefix, excludePrefix) {
  85. // Returns a list of keys, potentially with the given prefix
  86. var self = this;
  87. return Deferred(function (def) {
  88. setTimeout(util.resolver(def, function () {
  89. prefix = prefix || "";
  90. var result = [];
  91. for (var i = 0; i < self.storage.length; i++) {
  92. var key = self.storage.key(i);
  93. if (key.indexOf(self.prefix + prefix) === 0) {
  94. var shortKey = key.substr(self.prefix.length);
  95. if (excludePrefix) {
  96. shortKey = shortKey.substr(prefix.length);
  97. }
  98. result.push(shortKey);
  99. }
  100. }
  101. return result;
  102. }));
  103. });
  104. },
  105. toString: function () {
  106. return '[storage for ' + this.name + ']';
  107. }
  108. });
  109. var namePrefix = TogetherJS.config.get("storagePrefix");
  110. TogetherJS.config.close("storagePrefix");
  111. var storage = Storage('localStorage', localStorage, namePrefix + ".");
  112. storage.settings = util.mixinEvents({
  113. defaults: DEFAULT_SETTINGS,
  114. get: function (name) {
  115. assert(storage.settings.defaults.hasOwnProperty(name), "Unknown setting:", name);
  116. return storage.get("settings." + name, storage.settings.defaults[name]);
  117. },
  118. set: function (name, value) {
  119. assert(storage.settings.defaults.hasOwnProperty(name), "Unknown setting:", name);
  120. return storage.set("settings." + name, value);
  121. }
  122. });
  123. storage.tab = Storage('sessionStorage', sessionStorage, namePrefix + "-session.");
  124. return storage;
  125. });