cross-state 0.8.6 → 0.9.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.
- package/dist/cjs/cache.cjs +386 -0
- package/dist/cjs/cache.cjs.map +1 -0
- package/dist/cjs/index.cjs +21 -16
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +163 -11
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/react/register.cjs +12 -12
- package/dist/cjs/react/register.cjs.map +1 -1
- package/dist/cjs/scope.cjs +11 -379
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/{scope2.cjs → useCache.cjs} +54 -40
- package/dist/cjs/useCache.cjs.map +1 -0
- package/dist/es/cache.mjs +387 -0
- package/dist/es/cache.mjs.map +1 -0
- package/dist/es/index.mjs +16 -11
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react/index.mjs +161 -9
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/react/register.mjs +4 -4
- package/dist/es/scope.mjs +12 -380
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/store.mjs +3 -3
- package/dist/es/store.mjs.map +1 -1
- package/dist/es/{scope2.mjs → useCache.mjs} +58 -44
- package/dist/es/useCache.mjs.map +1 -0
- package/dist/types/lib/castArray.d.ts +1 -0
- package/dist/types/lib/path.d.ts +5 -7
- package/dist/types/lib/propAccess.d.ts +1 -1
- package/dist/types/lib/typeHelpers.d.ts +2 -1
- package/dist/types/lib/wildcardMatch.d.ts +3 -0
- package/dist/types/persist/persist.d.ts +6 -4
- package/dist/types/react/form.d.ts +48 -0
- package/dist/types/react/index.d.ts +1 -0
- package/dist/types/react/useProp.d.ts +5 -1
- package/dist/types/react/useStore.d.ts +5 -2
- package/package.json +23 -11
- package/dist/cjs/hash.cjs +0 -18
- package/dist/cjs/hash.cjs.map +0 -1
- package/dist/cjs/scope2.cjs.map +0 -1
- package/dist/es/hash.mjs +0 -19
- package/dist/es/hash.mjs.map +0 -1
- package/dist/es/scope2.mjs.map +0 -1
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { S as Store, c as createStore, a as calcDuration, j as makeSelector } from "./store.mjs";
|
|
2
|
+
import { h as hash } from "./scope.mjs";
|
|
3
|
+
class ResourceGroup {
|
|
4
|
+
constructor(name) {
|
|
5
|
+
this.name = name;
|
|
6
|
+
this.refMap = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
this.refSet = /* @__PURE__ */ new Set();
|
|
8
|
+
this.add = this.add.bind(this);
|
|
9
|
+
this.delete = this.delete.bind(this);
|
|
10
|
+
this.invalidateAll = this.invalidateAll.bind(this);
|
|
11
|
+
this.clearAll = this.clearAll.bind(this);
|
|
12
|
+
}
|
|
13
|
+
add(resource) {
|
|
14
|
+
const ref = new WeakRef(resource);
|
|
15
|
+
this.refMap.set(resource, ref);
|
|
16
|
+
this.refSet.add(ref);
|
|
17
|
+
}
|
|
18
|
+
delete(resource) {
|
|
19
|
+
const ref = this.refMap.get(resource);
|
|
20
|
+
if (ref) {
|
|
21
|
+
this.refMap.delete(resource);
|
|
22
|
+
this.refSet.delete(ref);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
invalidateAll() {
|
|
26
|
+
for (const ref of this.refSet) {
|
|
27
|
+
const resource = ref.deref();
|
|
28
|
+
if (resource) {
|
|
29
|
+
resource.invalidateAll();
|
|
30
|
+
} else {
|
|
31
|
+
this.refSet.delete(ref);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
clearAll() {
|
|
36
|
+
for (const ref of this.refSet) {
|
|
37
|
+
const resource = ref.deref();
|
|
38
|
+
if (resource) {
|
|
39
|
+
resource.clearAll();
|
|
40
|
+
} else {
|
|
41
|
+
this.refSet.delete(ref);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const allResources = /* @__PURE__ */ new ResourceGroup();
|
|
47
|
+
function createResourceGroup(name) {
|
|
48
|
+
return new ResourceGroup(name);
|
|
49
|
+
}
|
|
50
|
+
class InstanceCache {
|
|
51
|
+
constructor(factory, cacheTime) {
|
|
52
|
+
this.factory = factory;
|
|
53
|
+
this.cacheTime = cacheTime;
|
|
54
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
55
|
+
this.interval = this.cacheTime ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1)) : void 0;
|
|
56
|
+
}
|
|
57
|
+
cleanup() {
|
|
58
|
+
var _a;
|
|
59
|
+
const cutoff = this.now() - (this.cacheTime ?? 0);
|
|
60
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
61
|
+
if (entry.ref && entry.t <= cutoff) {
|
|
62
|
+
delete entry.ref;
|
|
63
|
+
}
|
|
64
|
+
if (!entry.ref && !((_a = entry.weakRef) == null ? void 0 : _a.deref())) {
|
|
65
|
+
this.cache.delete(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
get(...args) {
|
|
70
|
+
var _a;
|
|
71
|
+
const key = hash(args);
|
|
72
|
+
let entry = this.cache.get(key);
|
|
73
|
+
let value = (entry == null ? void 0 : entry.ref) ?? ((_a = entry == null ? void 0 : entry.weakRef) == null ? void 0 : _a.deref());
|
|
74
|
+
if (!entry || !value) {
|
|
75
|
+
value = this.factory(...args);
|
|
76
|
+
entry = {
|
|
77
|
+
t: this.now(),
|
|
78
|
+
ref: value,
|
|
79
|
+
weakRef: new WeakRef(value)
|
|
80
|
+
};
|
|
81
|
+
this.cache.set(key, entry);
|
|
82
|
+
} else {
|
|
83
|
+
entry.t = this.now();
|
|
84
|
+
entry.ref ?? (entry.ref = value);
|
|
85
|
+
}
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
values() {
|
|
89
|
+
return [...this.cache.values()].map((entry) => {
|
|
90
|
+
var _a;
|
|
91
|
+
return entry.ref ?? ((_a = entry.weakRef) == null ? void 0 : _a.deref());
|
|
92
|
+
}).filter((value) => !!value);
|
|
93
|
+
}
|
|
94
|
+
stop() {
|
|
95
|
+
if (this.interval) {
|
|
96
|
+
clearInterval(this.interval);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
stats() {
|
|
100
|
+
return {
|
|
101
|
+
count: this.cache.size,
|
|
102
|
+
withRef: [...this.cache.values()].filter((x) => !!x.ref).length,
|
|
103
|
+
withWeakRef: [...this.cache.values()].filter((x) => {
|
|
104
|
+
var _a;
|
|
105
|
+
return !!((_a = x.weakRef) == null ? void 0 : _a.deref());
|
|
106
|
+
}).length
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
now() {
|
|
110
|
+
return performance.now();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
class PromiseWithState extends Promise {
|
|
114
|
+
constructor(value, state = { status: "pending" }) {
|
|
115
|
+
super((resolve) => resolve(value));
|
|
116
|
+
this.state = state;
|
|
117
|
+
value.then((value2) => {
|
|
118
|
+
this.state = { status: "value", value: value2 };
|
|
119
|
+
}).catch((error) => {
|
|
120
|
+
this.state = { status: "error", error };
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
static resolve(value) {
|
|
124
|
+
return new PromiseWithState(Promise.resolve(value), {
|
|
125
|
+
status: "value",
|
|
126
|
+
value
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
static reject(error) {
|
|
130
|
+
return new PromiseWithState(Promise.reject(error), { status: "error", error });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
class Cache extends Store {
|
|
134
|
+
constructor(getter, options = {}, derivedFromCache, _call) {
|
|
135
|
+
super(
|
|
136
|
+
function() {
|
|
137
|
+
let result = getter.apply(this);
|
|
138
|
+
if (result instanceof Function) {
|
|
139
|
+
result = result(this);
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
},
|
|
143
|
+
options,
|
|
144
|
+
void 0,
|
|
145
|
+
_call
|
|
146
|
+
);
|
|
147
|
+
this.options = options;
|
|
148
|
+
this.derivedFromCache = derivedFromCache;
|
|
149
|
+
this.state = createStore({
|
|
150
|
+
status: "pending",
|
|
151
|
+
isStale: true,
|
|
152
|
+
isUpdating: false
|
|
153
|
+
});
|
|
154
|
+
this.invalidate = this.invalidate.bind(this);
|
|
155
|
+
this.clear = this.clear.bind(this);
|
|
156
|
+
this.mapValue = this.mapValue.bind(this);
|
|
157
|
+
this.calculationHelper.options.onInvalidate = () => this.invalidate({ invalidateDependencies: false });
|
|
158
|
+
this.watchPromise();
|
|
159
|
+
this.watchFocus();
|
|
160
|
+
}
|
|
161
|
+
get({ update = "whenStale", backgroundUpdate = false } = {}) {
|
|
162
|
+
var _a;
|
|
163
|
+
const promise = (_a = this._value) == null ? void 0 : _a.v;
|
|
164
|
+
const stalePromise = this.stalePromise;
|
|
165
|
+
if (update === "whenMissing" && !promise && !stalePromise || update === "whenStale" && !promise || update === "force") {
|
|
166
|
+
this.calculationHelper.execute();
|
|
167
|
+
if (!promise && !stalePromise || !backgroundUpdate) {
|
|
168
|
+
return super.get();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (!promise || stalePromise && backgroundUpdate) {
|
|
172
|
+
return stalePromise;
|
|
173
|
+
}
|
|
174
|
+
return promise;
|
|
175
|
+
}
|
|
176
|
+
updateValue(value) {
|
|
177
|
+
this.set(PromiseWithState.resolve(value));
|
|
178
|
+
}
|
|
179
|
+
updateError(error) {
|
|
180
|
+
this.set(PromiseWithState.reject(error));
|
|
181
|
+
}
|
|
182
|
+
invalidate({ invalidateDependencies = true } = {}) {
|
|
183
|
+
var _a;
|
|
184
|
+
const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;
|
|
185
|
+
if (clearOnInvalidate) {
|
|
186
|
+
return this.clear({ invalidateDependencies });
|
|
187
|
+
}
|
|
188
|
+
if (invalidateDependencies) {
|
|
189
|
+
this.calculationHelper.invalidateDependencies();
|
|
190
|
+
}
|
|
191
|
+
const { status, isStale, isUpdating } = this.state.get();
|
|
192
|
+
if (status !== "pending" && !isStale && !isUpdating) {
|
|
193
|
+
this.stalePromise = (_a = this._value) == null ? void 0 : _a.v;
|
|
194
|
+
}
|
|
195
|
+
this.state.set((state) => ({
|
|
196
|
+
...state,
|
|
197
|
+
isStale: true,
|
|
198
|
+
isUpdating: false
|
|
199
|
+
}));
|
|
200
|
+
this.calculationHelper.stop();
|
|
201
|
+
super.reset();
|
|
202
|
+
}
|
|
203
|
+
clear({ invalidateDependencies = true } = {}) {
|
|
204
|
+
if (invalidateDependencies) {
|
|
205
|
+
this.calculationHelper.invalidateDependencies();
|
|
206
|
+
}
|
|
207
|
+
this.state.set({
|
|
208
|
+
status: "pending",
|
|
209
|
+
isStale: true,
|
|
210
|
+
isUpdating: false
|
|
211
|
+
});
|
|
212
|
+
delete this.stalePromise;
|
|
213
|
+
this.calculationHelper.stop();
|
|
214
|
+
super.reset();
|
|
215
|
+
}
|
|
216
|
+
mapValue(_selector) {
|
|
217
|
+
const selector = makeSelector(_selector);
|
|
218
|
+
const derivedFromCache = {
|
|
219
|
+
cache: this.derivedFromCache ? this.derivedFromCache.cache : this,
|
|
220
|
+
selectors: this.derivedFromCache ? [...this.derivedFromCache.selectors, _selector] : [_selector]
|
|
221
|
+
};
|
|
222
|
+
const that = this;
|
|
223
|
+
return new Cache(
|
|
224
|
+
async function() {
|
|
225
|
+
const value = await this.use(that);
|
|
226
|
+
return selector(value);
|
|
227
|
+
},
|
|
228
|
+
{},
|
|
229
|
+
derivedFromCache
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
watchPromise() {
|
|
233
|
+
this.subscribe(
|
|
234
|
+
async (promise) => {
|
|
235
|
+
var _a, _b;
|
|
236
|
+
if (promise instanceof PromiseWithState) {
|
|
237
|
+
this.state.set({
|
|
238
|
+
...promise.state,
|
|
239
|
+
isStale: false,
|
|
240
|
+
isUpdating: false
|
|
241
|
+
});
|
|
242
|
+
delete this.stalePromise;
|
|
243
|
+
this.setTimers();
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
this.state.set((state) => ({
|
|
247
|
+
...state,
|
|
248
|
+
isUpdating: true
|
|
249
|
+
}));
|
|
250
|
+
this.setTimers();
|
|
251
|
+
try {
|
|
252
|
+
const value = await promise;
|
|
253
|
+
if (promise !== ((_a = this._value) == null ? void 0 : _a.v)) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
this.state.set({
|
|
257
|
+
status: "value",
|
|
258
|
+
value,
|
|
259
|
+
isStale: false,
|
|
260
|
+
isUpdating: false
|
|
261
|
+
});
|
|
262
|
+
delete this.stalePromise;
|
|
263
|
+
this.setTimers();
|
|
264
|
+
} catch (error) {
|
|
265
|
+
if (promise !== ((_b = this._value) == null ? void 0 : _b.v)) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this.state.set({
|
|
269
|
+
status: "error",
|
|
270
|
+
error,
|
|
271
|
+
isStale: false,
|
|
272
|
+
isUpdating: false
|
|
273
|
+
});
|
|
274
|
+
delete this.stalePromise;
|
|
275
|
+
this.setTimers();
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
{ passive: true }
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
setTimers() {
|
|
282
|
+
if (this.invalidationTimer) {
|
|
283
|
+
clearTimeout(this.invalidationTimer);
|
|
284
|
+
}
|
|
285
|
+
this.invalidationTimer = void 0;
|
|
286
|
+
const state = this.state.get();
|
|
287
|
+
let { invalidateAfter = createCache.defaultOptions.invalidateAfter } = this.options;
|
|
288
|
+
const ref = new WeakRef(this);
|
|
289
|
+
if (state.status === "pending") {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (invalidateAfter instanceof Function) {
|
|
293
|
+
invalidateAfter = invalidateAfter(state);
|
|
294
|
+
}
|
|
295
|
+
if (invalidateAfter !== null && invalidateAfter !== void 0) {
|
|
296
|
+
this.invalidationTimer = setTimeout(
|
|
297
|
+
() => {
|
|
298
|
+
var _a;
|
|
299
|
+
return (_a = ref == null ? void 0 : ref.deref()) == null ? void 0 : _a.invalidate();
|
|
300
|
+
},
|
|
301
|
+
calcDuration(invalidateAfter)
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
watchFocus() {
|
|
306
|
+
const { invalidateOnWindowFocus = createCache.defaultOptions.invalidateOnWindowFocus } = this.options;
|
|
307
|
+
if (!invalidateOnWindowFocus || typeof document === "undefined" || typeof document.addEventListener === "undefined") {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const ref = new WeakRef(this);
|
|
311
|
+
const onFocus = () => {
|
|
312
|
+
const that = ref == null ? void 0 : ref.deref();
|
|
313
|
+
if (!that) {
|
|
314
|
+
document.removeEventListener("visibilitychange", onFocus);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (!document.hidden) {
|
|
318
|
+
that.invalidate();
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
document.addEventListener("visibilitychange", onFocus);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function create(cacheFunction, options) {
|
|
325
|
+
const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } = options ?? {};
|
|
326
|
+
let baseInstance;
|
|
327
|
+
const instanceCache = new InstanceCache(
|
|
328
|
+
(...args) => {
|
|
329
|
+
if (args.length === 0 && baseInstance) {
|
|
330
|
+
return baseInstance;
|
|
331
|
+
}
|
|
332
|
+
return new Cache(function() {
|
|
333
|
+
return cacheFunction.apply(this, args);
|
|
334
|
+
}, options);
|
|
335
|
+
},
|
|
336
|
+
clearUnusedAfter ? calcDuration(clearUnusedAfter) : void 0
|
|
337
|
+
);
|
|
338
|
+
const get = (...args) => {
|
|
339
|
+
return instanceCache.get(...args);
|
|
340
|
+
};
|
|
341
|
+
const invalidateAll = () => {
|
|
342
|
+
for (const instance of instanceCache.values()) {
|
|
343
|
+
instance.invalidate();
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
const clearAll = () => {
|
|
347
|
+
for (const instance of instanceCache.values()) {
|
|
348
|
+
instance.clear();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
baseInstance = Object.assign(
|
|
352
|
+
new Cache(
|
|
353
|
+
function() {
|
|
354
|
+
return cacheFunction.apply(this);
|
|
355
|
+
},
|
|
356
|
+
options,
|
|
357
|
+
void 0,
|
|
358
|
+
get
|
|
359
|
+
),
|
|
360
|
+
{
|
|
361
|
+
invalidateAll,
|
|
362
|
+
clearAll
|
|
363
|
+
}
|
|
364
|
+
);
|
|
365
|
+
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
366
|
+
for (const group of groups.concat(allResources)) {
|
|
367
|
+
group.add(baseInstance);
|
|
368
|
+
}
|
|
369
|
+
get(...[]);
|
|
370
|
+
return baseInstance;
|
|
371
|
+
}
|
|
372
|
+
const createCache = /* @__PURE__ */ Object.assign(create, {
|
|
373
|
+
defaultOptions: {
|
|
374
|
+
invalidateOnWindowFocus: true,
|
|
375
|
+
invalidateOnActivation: true,
|
|
376
|
+
clearUnusedAfter: { days: 1 }
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
export {
|
|
380
|
+
Cache as C,
|
|
381
|
+
InstanceCache as I,
|
|
382
|
+
ResourceGroup as R,
|
|
383
|
+
allResources as a,
|
|
384
|
+
createResourceGroup as b,
|
|
385
|
+
createCache as c
|
|
386
|
+
};
|
|
387
|
+
//# sourceMappingURL=cache.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.mjs","sources":["../../src/core/resourceGroup.ts","../../src/lib/instanceCache.ts","../../src/lib/promiseWithState.ts","../../src/core/cache.ts"],"sourcesContent":["export interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n this.add = this.add.bind(this);\n this.delete = this.delete.bind(this);\n this.invalidateAll = this.invalidateAll.bind(this);\n this.clearAll = this.clearAll.bind(this);\n }\n\n add(resource: Resource) {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource) {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string) {\n return new ResourceGroup(name);\n}\n","import { hash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(public readonly factory: (...args: Args) => T, public readonly cacheTime?: number) {}\n\n cleanup() {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args) {\n const key = hash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values() {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats() {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(Promise.resolve(value as MaybePromise<T>), {\n status: 'value',\n value: value as T,\n });\n }\n\n static override reject<T = never>(error: unknown) {\n // eslint-disable-next-line promise/no-promise-in-callback\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: Promise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n value\n .then((value) => {\n this.state = { status: 'value', value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n }\n}\n","import type { Duration, Selector, Use } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore } from './store';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (this: { use: Use }, ...args: Args): Promise<T> | ((cache: { use: Use }) => Promise<T>);\n}\n\nexport interface CacheOptions<T> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: number;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: CacheFunction<T>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(\n function () {\n let result = getter.apply(this);\n\n if (result instanceof Function) {\n result = result(this);\n }\n\n return result;\n },\n options,\n undefined,\n _call,\n );\n this.invalidate = this.invalidate.bind(this);\n this.clear = this.clear.bind(this);\n this.mapValue = this.mapValue.bind(this);\n\n this.calculationHelper.options.onInvalidate = () =>\n this.invalidate({ invalidateDependencies: false });\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}) {\n const promise = this._value?.v;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculationHelper.execute();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return super.get();\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T>) {\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown) {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this._value?.v;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n this.calculationHelper.stop();\n super.reset();\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n delete this.stalePromise;\n\n this.calculationHelper.stop();\n super.reset();\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<P extends Path<T>>(selector: P): Cache<Value<T, P>>;\n\n mapValue<S>(_selector: Selector<T, S> | Path<any>): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: this.derivedFromCache ? this.derivedFromCache.cache : this,\n selectors: this.derivedFromCache\n ? [...this.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n const that = this;\n\n return new Cache(\n async function () {\n const value = await this.use(that);\n return selector(value);\n },\n {},\n derivedFromCache,\n );\n }\n\n protected watchPromise() {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState) {\n this.state.set({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n });\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers() {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter = createCache.defaultOptions.invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus() {\n const { invalidateOnWindowFocus = createCache.defaultOptions.invalidateOnWindowFocus } =\n this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[]>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } =\n options ?? {};\n\n let baseInstance: CreateReturnType<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new Cache(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new Cache(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n } as CacheOptions<unknown>,\n});\n"],"names":["value"],"mappings":"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"}
|
package/dist/es/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { S as Store, c as createStore, a as calcDuration, q as queue, b as castArrayPath, s as shallowEqual, g as get, d as set } from "./store.mjs";
|
|
2
2
|
import { e, m, r, f } from "./store.mjs";
|
|
3
|
-
import { I as InstanceCache, a as allResources } from "./
|
|
4
|
-
import { C, R,
|
|
5
|
-
import "./
|
|
3
|
+
import { I as InstanceCache, a as allResources } from "./cache.mjs";
|
|
4
|
+
import { C, R, c, b } from "./cache.mjs";
|
|
5
|
+
import { S, c as c2 } from "./scope.mjs";
|
|
6
6
|
class SubstriptionCache extends Store {
|
|
7
7
|
constructor(connectFunction, options = {}, derivedFromSubscriptionCache, _call) {
|
|
8
8
|
super(void 0, options, void 0, _call);
|
|
@@ -329,14 +329,16 @@ class Persist {
|
|
|
329
329
|
this.stopped = false;
|
|
330
330
|
this.storage = normalizeStorage(options.storage);
|
|
331
331
|
this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);
|
|
332
|
-
this.paths = (options.paths ?? []).map(
|
|
333
|
-
|
|
334
|
-
path: castArrayPath(p)
|
|
335
|
-
} : {
|
|
336
|
-
path: castArrayPath(p.path),
|
|
337
|
-
throttleMs: p.throttleMs
|
|
332
|
+
this.paths = (options.paths ?? []).map((p) => {
|
|
333
|
+
if (isPlainPath(p)) {
|
|
334
|
+
return { path: castArrayPath(p) };
|
|
338
335
|
}
|
|
339
|
-
|
|
336
|
+
const _p = p;
|
|
337
|
+
return {
|
|
338
|
+
path: castArrayPath(_p.path),
|
|
339
|
+
throttleMs: _p.throttleMs
|
|
340
|
+
};
|
|
341
|
+
}).sort((a, b2) => b2.path.length - a.path.length);
|
|
340
342
|
if (this.paths.length === 0) {
|
|
341
343
|
this.paths.push({ path: ["*"] });
|
|
342
344
|
}
|
|
@@ -432,6 +434,9 @@ class Persist {
|
|
|
432
434
|
function persist(store, options) {
|
|
433
435
|
return new Persist(store, options);
|
|
434
436
|
}
|
|
437
|
+
function isPlainPath(p) {
|
|
438
|
+
return typeof p === "string" || Array.isArray(p);
|
|
439
|
+
}
|
|
435
440
|
export {
|
|
436
441
|
C as Cache,
|
|
437
442
|
InstanceCache,
|
|
@@ -444,7 +449,7 @@ export {
|
|
|
444
449
|
calcDuration,
|
|
445
450
|
c as createCache,
|
|
446
451
|
b as createResourceGroup,
|
|
447
|
-
|
|
452
|
+
c2 as createScope,
|
|
448
453
|
createStore,
|
|
449
454
|
createSubscriptionCache,
|
|
450
455
|
createUrlStore,
|
package/dist/es/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/core/subscriptionCache.ts","../../src/core/urlStore.ts","../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/lib/diff.ts","../../src/persist/persist.ts"],"sourcesContent":["import {\n type CalculationHelpers,\n type Cancel,\n type ConnectionState,\n type Duration,\n type Selector,\n} from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { createStore, Store } from './store';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { type Path } from '@lib/path';\n\nexport interface SubscriptionCacheFunction<T, Args extends any[] = []> {\n (this: CalculationHelpers<T | undefined>, ...args: Args):\n | Cancel\n | void\n | ((cache: CalculationHelpers<T | undefined>) => Cancel | void);\n}\n\nexport interface SubstriptionCacheOptions {\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: Duration;\n}\n\nexport class SubstriptionCache<T> extends Store<T | undefined> {\n readonly state = createStore({\n connectionState: 'closed' as ConnectionState,\n error: undefined as unknown | undefined,\n });\n\n constructor(\n public readonly connectFunction: SubscriptionCacheFunction<T>,\n public readonly options: SubstriptionCacheOptions = {},\n public readonly derivedFromSubscriptionCache?: {\n subscriptionCache: SubstriptionCache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(undefined, options, undefined, _call);\n\n this.calculationHelper.options = {\n ...this.calculationHelper.options,\n calculate: (helpers) => {\n let result = connectFunction.apply(helpers);\n\n if (result instanceof Function && result.length > 0) {\n result = result(helpers);\n }\n\n return result as Cancel | void;\n },\n onValue: (value) => {\n this.set(value);\n },\n onError: (error) => {\n this.state.set('error', error);\n },\n onConnectionState: (state) => {\n this.state.set('connectionState', state);\n },\n onInvalidate: () => {\n this.invalidate();\n },\n };\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate = defaultOptions.clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n}\n\nconst defaultOptions: SubstriptionCacheOptions = {\n clearUnusedAfter: { days: 1 },\n retain: { seconds: 1 },\n};\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): SubstriptionCache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? SubstriptionCache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: SubscriptionCacheFunction<T, Args>,\n options?: SubstriptionCacheOptions,\n): CreateReturnType<T, Args> {\n const { clearUnusedAfter = defaultOptions.clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const instanceCache = new InstanceCache<Args, SubstriptionCache<T>>(\n (...args: Args): SubstriptionCache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new SubstriptionCache(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new SubstriptionCache<T>(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createSubscriptionCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions,\n});\n","import { type Update } from './commonTypes';\nimport { Store, type StoreOptions } from './store';\nimport { type Path, type Value } from '@lib/path';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nexport class UrlStore<T> extends Store<T> {\n private serializedDefaultValue = this.options.serialize(this.options.defaultValue);\n\n constructor(public readonly options: UrlStoreOptionsRequired<T>) {\n super(() => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[options.type].slice(1));\n const urlValue = parameters.get(options.key);\n const deserialize: (value: string) => T = options.deserialize ?? defaultDeserializer;\n return urlValue !== null ? deserialize(urlValue) : options.defaultValue;\n });\n\n this.addEffect(() => this.watchUrl());\n }\n\n override set(update: Update<T>): void;\n\n override set<P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n override set(...args: any): void {\n super.set.apply(this, args);\n this.updateUrl(super.get());\n }\n\n protected watchUrl() {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n this.reset();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n this.reset();\n };\n\n window.addEventListener('popstate', this.reset);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', this.reset);\n };\n }\n\n protected updateUrl(value: T | undefined) {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[this.options.type].slice(1));\n const serializedValue = value !== undefined ? this.options.serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === this.serializedDefaultValue) {\n parameters.delete(this.options.key);\n } else {\n parameters.set(this.options.key, serializedValue);\n }\n\n url[this.options.type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n\n this.options.onCommit?.(value);\n }\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): UrlStore<T>;\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): UrlStore<T | undefined>;\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n return new UrlStore({\n ...options,\n type: options.type ?? 'search',\n serialize: options.serialize ?? defaultSerializer,\n deserialize: options.deserialize ?? defaultDeserializer,\n defaultValue: options.defaultValue ?? (undefined as T),\n });\n}\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!(newValue[key] instanceof Object)) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (value instanceof Promise) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport function diff(a: any, b: any): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\n }\n\n if (a instanceof Object && b instanceof Object && Array.isArray(a) === Array.isArray(b)) {\n return yield* objectDiff(a, b, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], [...prefix, castKey(key)]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?:\n | WildcardPath<T>[]\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n }[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n storage: PersistStorageWithKeys;\n\n paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n channel: BroadcastChannel;\n\n queue = queue();\n\n handles = new Set<Cancel>();\n\n stopped = false;\n\n updateInProgress?: [any, any];\n\n constructor(public readonly store: Store<T>, public readonly options: PersistOptions<T>) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) =>\n typeof p === 'string' || Array.isArray(p)\n ? {\n path: castArrayPath(p as any),\n }\n : {\n path: castArrayPath(p.path as any),\n throttleMs: p.throttleMs,\n },\n )\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.watchStore();\n this.watchStorage();\n }\n\n watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n async watchStorage() {\n let keys = this.storage.keys();\n if (keys instanceof Promise) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = JSON.parse(key);\n this.queue(() => this.load(path));\n }\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = JSON.stringify(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n save(path: KeyType[]) {\n const key = JSON.stringify(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = JSON.parse(k);\n return (\n parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n"],"names":["get","b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/core/subscriptionCache.ts","../../src/core/urlStore.ts","../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/lib/diff.ts","../../src/persist/persist.ts"],"sourcesContent":["import {\n type CalculationHelpers,\n type Cancel,\n type ConnectionState,\n type Duration,\n type Selector,\n} from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { createStore, Store } from './store';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { type Path } from '@lib/path';\n\nexport interface SubscriptionCacheFunction<T, Args extends any[] = []> {\n (this: CalculationHelpers<T | undefined>, ...args: Args):\n | Cancel\n | void\n | ((cache: CalculationHelpers<T | undefined>) => Cancel | void);\n}\n\nexport interface SubstriptionCacheOptions {\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: Duration;\n}\n\nexport class SubstriptionCache<T> extends Store<T | undefined> {\n readonly state = createStore({\n connectionState: 'closed' as ConnectionState,\n error: undefined as unknown | undefined,\n });\n\n constructor(\n public readonly connectFunction: SubscriptionCacheFunction<T>,\n public readonly options: SubstriptionCacheOptions = {},\n public readonly derivedFromSubscriptionCache?: {\n subscriptionCache: SubstriptionCache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(undefined, options, undefined, _call);\n\n this.calculationHelper.options = {\n ...this.calculationHelper.options,\n calculate: (helpers) => {\n let result = connectFunction.apply(helpers);\n\n if (result instanceof Function && result.length > 0) {\n result = result(helpers);\n }\n\n return result as Cancel | void;\n },\n onValue: (value) => {\n this.set(value);\n },\n onError: (error) => {\n this.state.set('error', error);\n },\n onConnectionState: (state) => {\n this.state.set('connectionState', state);\n },\n onInvalidate: () => {\n this.invalidate();\n },\n };\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate = defaultOptions.clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n}\n\nconst defaultOptions: SubstriptionCacheOptions = {\n clearUnusedAfter: { days: 1 },\n retain: { seconds: 1 },\n};\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): SubstriptionCache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? SubstriptionCache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: SubscriptionCacheFunction<T, Args>,\n options?: SubstriptionCacheOptions,\n): CreateReturnType<T, Args> {\n const { clearUnusedAfter = defaultOptions.clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const instanceCache = new InstanceCache<Args, SubstriptionCache<T>>(\n (...args: Args): SubstriptionCache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new SubstriptionCache(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new SubstriptionCache<T>(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createSubscriptionCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions,\n});\n","import { type Update } from './commonTypes';\nimport { Store, type StoreOptions } from './store';\nimport { type Path, type Value } from '@lib/path';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nexport class UrlStore<T> extends Store<T> {\n private serializedDefaultValue = this.options.serialize(this.options.defaultValue);\n\n constructor(public readonly options: UrlStoreOptionsRequired<T>) {\n super(() => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[options.type].slice(1));\n const urlValue = parameters.get(options.key);\n const deserialize: (value: string) => T = options.deserialize ?? defaultDeserializer;\n return urlValue !== null ? deserialize(urlValue) : options.defaultValue;\n });\n\n this.addEffect(() => this.watchUrl());\n }\n\n override set(update: Update<T>): void;\n\n override set<P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n override set(...args: any): void {\n super.set.apply(this, args);\n this.updateUrl(super.get());\n }\n\n protected watchUrl() {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n this.reset();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n this.reset();\n };\n\n window.addEventListener('popstate', this.reset);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', this.reset);\n };\n }\n\n protected updateUrl(value: T | undefined) {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[this.options.type].slice(1));\n const serializedValue = value !== undefined ? this.options.serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === this.serializedDefaultValue) {\n parameters.delete(this.options.key);\n } else {\n parameters.set(this.options.key, serializedValue);\n }\n\n url[this.options.type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n\n this.options.onCommit?.(value);\n }\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): UrlStore<T>;\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): UrlStore<T | undefined>;\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n return new UrlStore({\n ...options,\n type: options.type ?? 'search',\n serialize: options.serialize ?? defaultSerializer,\n deserialize: options.deserialize ?? defaultDeserializer,\n defaultValue: options.defaultValue ?? (undefined as T),\n });\n}\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!(newValue[key] instanceof Object)) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (value instanceof Promise) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport function diff(a: any, b: any): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\n }\n\n if (a instanceof Object && b instanceof Object && Array.isArray(a) === Array.isArray(b)) {\n return yield* objectDiff(a, b, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], [...prefix, castKey(key)]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n storage: PersistStorageWithKeys;\n\n paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n channel: BroadcastChannel;\n\n queue = queue();\n\n handles = new Set<Cancel>();\n\n stopped = false;\n\n updateInProgress?: [any, any];\n\n constructor(public readonly store: Store<T>, public readonly options: PersistOptions<T>) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.watchStore();\n this.watchStorage();\n }\n\n watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n async watchStorage() {\n let keys = this.storage.keys();\n if (keys instanceof Promise) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = JSON.parse(key);\n this.queue(() => this.load(path));\n }\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = JSON.stringify(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n save(path: KeyType[]) {\n const key = JSON.stringify(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = JSON.parse(k);\n return (\n parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["get","b"],"mappings":"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"}
|