@astral/mobx-query 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,10 +4,6 @@ import { Mutation, } from '../Mutation';
4
4
  import { DataStorageFactory } from '../DataStorage';
5
5
  import { StatusStorageFactory } from '../StatusStorage';
6
6
  import { AdaptableMap } from '../AdaptableMap';
7
- /**
8
- * Время, спустя которое, запись о query c network-only будет удалена
9
- */
10
- const DEFAULT_TIME_TO_CLEAN = 100;
11
7
  /**
12
8
  * Сервис, позволяющий кэшировать данные.
13
9
  */
@@ -35,7 +31,7 @@ export class MobxQuery {
35
31
  * предполагается использование из домена
36
32
  */
37
33
  this.invalidate = (keysParts) => {
38
- // Сет сериализовонных ключей
34
+ // Сет сериализованных ключей
39
35
  const keysSet = new Set(keysParts.map(this.serialize));
40
36
  [...this.keys.keys()].forEach((keyHash) => {
41
37
  const key = this.keys.get(keyHash);
@@ -91,30 +87,36 @@ export class MobxQuery {
91
87
  dataStorage: this.queryDataStorageFactory.getStorage(keys.dataKeyHash),
92
88
  statusStorage: this.statusStorageFactory.getStorage(keys.statusKeyHash),
93
89
  backgroundStatusStorage: this.getBackgroundStatusStorage(keys.backgroundStatusKeyHash, Boolean(createParams === null || createParams === void 0 ? void 0 : createParams.isBackground)),
94
- submitValidity: () => this.submitValidity(keys.queryKeyHash),
90
+ submitValidity:
91
+ // 'network-only' квери не будут подтверждать свою валидность,
92
+ // следовательно, они всегда будут храниться как "слабые",
93
+ // что позволит сборщику мусора удалять их из памяти при отсутствии ссылок
94
+ fetchPolicy !== 'network-only'
95
+ ? () => this.submitValidity(keys.queryKeyHash)
96
+ : undefined,
95
97
  });
96
98
  this.queriesMap.set(keys.queryKeyHash, query);
97
99
  this.keys.set(keys.queryKeyHash, keys.queryKey);
98
- // Ожидается, что network-only квери не должны кешироваться,
99
- // но, с введением StrictMode в реакт 18, проявилась проблема,
100
- // что network-only квери, созданные в одном реакт компоненте,
101
- // создаются дважды (т.к. все хуки вызываются дважды)
102
- // и т.к. мы не ограничиваем момент запроса,
103
- // то можем получить эффект, что оба network-only квери
104
- // делают по отдельному запросу к данным единомоментно,
105
- if (fetchPolicy === 'network-only') {
106
- setTimeout(() => {
107
- this.queriesMap.delete(keys.queryKeyHash);
108
- this.keys.delete(keys.queryKeyHash);
109
- }, DEFAULT_TIME_TO_CLEAN);
110
- }
111
100
  return query;
112
101
  };
113
102
  /**
114
103
  * Метод для создания ключей к внутренним хранилищам
115
104
  */
116
105
  this.makeKeys = (rootKey, fetchPolicy, isBackground, type) => {
117
- const queryKey = [...rootKey, { fetchPolicy, isBackground, type }];
106
+ // C введением StrictMode в реакт 18, проявилась проблема,
107
+ // что network-only квери, созданные в одном реакт компоненте,
108
+ // создаются дважды (т.к. все хуки вызываются дважды)
109
+ // и т.к. мы не ограничиваем момент запроса,
110
+ // то можем получить эффект, что оба network-only квери
111
+ // делают по отдельному запросу к данным единомоментно.
112
+ // Для решения этой проблемы, добавляем уникальный ключ даты, с обнуляемыми милисекундами,
113
+ // что позволит создавать одинаковые network-only квери в течении одной секунды.
114
+ // Остается крайне редкий корнер кейс, когда разница между созданиями квери крайне мала,
115
+ // но все таки первый был создан в одной секунде, а последующее создание уже попало в следующую секунду.
116
+ // Этот кейс крайне маловероятен, и будет проявляться только в дев режиме с включенным StrictMode,
117
+ // поэтому мы пренебрегаем решением этой проблемы, в угоду упрощения.
118
+ const date = fetchPolicy === 'network-only' ? new Date().setMilliseconds(0) : null;
119
+ const queryKey = [...rootKey, { fetchPolicy, date, isBackground, type }];
118
120
  const queryKeyHash = this.serialize(queryKey);
119
121
  const dataKeyHash = this.serialize([...rootKey, { type }]);
120
122
  const statusKeyHash = this.serialize([...rootKey, { type }]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/mobx-query",
3
- "version": "1.6.2",
3
+ "version": "1.7.0",
4
4
  "browser": "./index.js",
5
5
  "main": "./index.js",
6
6
  "dependencies": {