@iamjulianacosta/mobx-data 1.0.1 → 1.1.1
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/{JsonApiSerializer-CKB02AgP.cjs → JsonApiSerializer-Bc4iQB0d.cjs} +2 -2
- package/dist/{JsonApiSerializer-CKB02AgP.cjs.map → JsonApiSerializer-Bc4iQB0d.cjs.map} +1 -1
- package/dist/{JsonApiSerializer-CC5HXp4b.js → JsonApiSerializer-wndq5a1n.js} +2 -2
- package/dist/{JsonApiSerializer-CC5HXp4b.js.map → JsonApiSerializer-wndq5a1n.js.map} +1 -1
- package/dist/{MemoryAdapter-D1cTyydm.cjs → MemoryAdapter-BTK2D64s.cjs} +2 -2
- package/dist/{MemoryAdapter-D1cTyydm.cjs.map → MemoryAdapter-BTK2D64s.cjs.map} +1 -1
- package/dist/{MemoryAdapter-Bx1e7ndV.js → MemoryAdapter-ni25N4H0.js} +2 -2
- package/dist/{MemoryAdapter-Bx1e7ndV.js.map → MemoryAdapter-ni25N4H0.js.map} +1 -1
- package/dist/{ODataAdapter-C4IHK4BK.js → ODataAdapter-DAja_jKM.js} +2 -2
- package/dist/{ODataAdapter-C4IHK4BK.js.map → ODataAdapter-DAja_jKM.js.map} +1 -1
- package/dist/{ODataAdapter-DyyF1sdA.cjs → ODataAdapter-lMifLyLD.cjs} +2 -2
- package/dist/{ODataAdapter-DyyF1sdA.cjs.map → ODataAdapter-lMifLyLD.cjs.map} +1 -1
- package/dist/RestAdapter-1V94stW-.cjs +2 -0
- package/dist/{RestAdapter-CJOwTsKK.cjs.map → RestAdapter-1V94stW-.cjs.map} +1 -1
- package/dist/{RestAdapter-B4aRvs4m.js → RestAdapter-CGWqOR_G.js} +32 -23
- package/dist/{RestAdapter-B4aRvs4m.js.map → RestAdapter-CGWqOR_G.js.map} +1 -1
- package/dist/Store-KvjmBTQ9.cjs +2 -0
- package/dist/Store-KvjmBTQ9.cjs.map +1 -0
- package/dist/{Store-CZ7Z-Nme.js → Store-mvrDLQEZ.js} +195 -150
- package/dist/Store-mvrDLQEZ.js.map +1 -0
- package/dist/adapter/RestAdapter.d.ts.map +1 -1
- package/dist/adapter/index.cjs +1 -1
- package/dist/adapter/index.js +2 -2
- package/dist/cache/IndexedDBCache.d.ts +22 -0
- package/dist/cache/IndexedDBCache.d.ts.map +1 -0
- package/dist/cache/cache-utils.d.ts +4 -0
- package/dist/cache/cache-utils.d.ts.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/types.d.ts +25 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache-utils-2lswvJ87.cjs +2 -0
- package/dist/cache-utils-2lswvJ87.cjs.map +1 -0
- package/dist/cache-utils-38Dqu4Qf.js +39 -0
- package/dist/cache-utils-38Dqu4Qf.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -49
- package/dist/index.js.map +1 -1
- package/dist/json-api/index.cjs +1 -1
- package/dist/json-api/index.js +1 -1
- package/dist/odata/index.cjs +1 -1
- package/dist/odata/index.js +1 -1
- package/dist/store/Store.d.ts +6 -0
- package/dist/store/Store.d.ts.map +1 -1
- package/dist/store/index.cjs +1 -1
- package/dist/store/index.js +1 -1
- package/package.json +2 -1
- package/src/adapter/RestAdapter.ts +12 -2
- package/src/cache/IndexedDBCache.ts +171 -0
- package/src/cache/cache-utils.ts +57 -0
- package/src/cache/index.ts +12 -0
- package/src/cache/types.ts +33 -0
- package/src/index.ts +1 -0
- package/src/store/Store.ts +100 -0
- package/dist/RestAdapter-CJOwTsKK.cjs +0 -2
- package/dist/Store-BdwMrbDi.cjs +0 -2
- package/dist/Store-BdwMrbDi.cjs.map +0 -1
- package/dist/Store-CZ7Z-Nme.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,52 +1,147 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
import { a as
|
|
3
|
-
import { S as
|
|
4
|
-
import { A as
|
|
5
|
-
import { A as
|
|
6
|
-
import { A as
|
|
7
|
-
import { M as
|
|
8
|
-
import { S as
|
|
9
|
-
import { E as
|
|
10
|
-
import { B as
|
|
11
|
-
import { C as
|
|
12
|
-
import { J as
|
|
13
|
-
import { O as
|
|
1
|
+
import { A as T, M as b, R as _ } from "./types-C9NB2gRj.js";
|
|
2
|
+
import { a as E, b as R, h as w } from "./decorators-Zr35qr6A.js";
|
|
3
|
+
import { S as P } from "./SchemaService-DZwkFgZu.js";
|
|
4
|
+
import { A as g, a as L, E as q, M as D, b as H, S as K, c as O } from "./relationships-BEXANmWg.js";
|
|
5
|
+
import { A as I, I as B, R as J, S as z } from "./Store-mvrDLQEZ.js";
|
|
6
|
+
import { A as k, R as Y } from "./RestAdapter-CGWqOR_G.js";
|
|
7
|
+
import { M as C } from "./MemoryAdapter-ni25N4H0.js";
|
|
8
|
+
import { S as $ } from "./Serializer-FxJbsZ50.js";
|
|
9
|
+
import { E as G, J as Q, R as W } from "./EmbeddedRecordsMixin-VoHluHCT.js";
|
|
10
|
+
import { B as Z, a as ee, D as te, N as se, S as ae } from "./date-Bj4O2W1F.js";
|
|
11
|
+
import { C as oe, F as ne, R as ce } from "./CacheHandler-BTU_rYkv.js";
|
|
12
|
+
import { J as de, a as ue } from "./JsonApiSerializer-wndq5a1n.js";
|
|
13
|
+
import { O as pe } from "./ODataAdapter-DAja_jKM.js";
|
|
14
|
+
import { R as me, a as Ae, e as fe, p as ye } from "./cache-utils-38Dqu4Qf.js";
|
|
15
|
+
const o = "cache-entries", h = 1, m = 36e5;
|
|
16
|
+
class u {
|
|
17
|
+
constructor(e = {}) {
|
|
18
|
+
this._database = null, this._openPromise = null, this._databaseName = e.databaseName ?? "mobx-data-cache", this._defaultTTL = e.defaultTTL ?? m;
|
|
19
|
+
}
|
|
20
|
+
get defaultTTL() {
|
|
21
|
+
return this._defaultTTL;
|
|
22
|
+
}
|
|
23
|
+
async open() {
|
|
24
|
+
return this._database ? this._database : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e, s) => {
|
|
25
|
+
const t = indexedDB.open(this._databaseName, h);
|
|
26
|
+
t.onupgradeneeded = () => {
|
|
27
|
+
const a = t.result;
|
|
28
|
+
if (!a.objectStoreNames.contains(o)) {
|
|
29
|
+
const n = a.createObjectStore(o, {
|
|
30
|
+
keyPath: "key"
|
|
31
|
+
});
|
|
32
|
+
n.createIndex("modelName", "modelName", { unique: !1 }), n.createIndex("expiresAt", "expiresAt", { unique: !1 });
|
|
33
|
+
}
|
|
34
|
+
}, t.onsuccess = () => {
|
|
35
|
+
this._database = t.result, e(this._database);
|
|
36
|
+
}, t.onerror = () => {
|
|
37
|
+
this._openPromise = null, s(t.error);
|
|
38
|
+
};
|
|
39
|
+
}), this._openPromise);
|
|
40
|
+
}
|
|
41
|
+
static cacheKey(e, s) {
|
|
42
|
+
return `${e}:${s}`;
|
|
43
|
+
}
|
|
44
|
+
async get(e, s) {
|
|
45
|
+
const t = await this.open();
|
|
46
|
+
return new Promise((a, n) => {
|
|
47
|
+
const r = t.transaction(o, "readonly").objectStore(o).get(u.cacheKey(e, s));
|
|
48
|
+
r.onsuccess = () => {
|
|
49
|
+
const c = r.result;
|
|
50
|
+
if (!c) {
|
|
51
|
+
a(null);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (Date.now() > c.expiresAt) {
|
|
55
|
+
this.invalidate(e, s), a(null);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
a(c);
|
|
59
|
+
}, r.onerror = () => n(r.error);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async set(e, s, t, a = {}) {
|
|
63
|
+
const n = await this.open(), d = Date.now(), i = a.ttl ?? this._defaultTTL, r = {
|
|
64
|
+
key: u.cacheKey(e, s),
|
|
65
|
+
modelName: e,
|
|
66
|
+
id: s,
|
|
67
|
+
attributes: t,
|
|
68
|
+
relationships: a.relationships,
|
|
69
|
+
cachedAt: d,
|
|
70
|
+
expiresAt: d + i
|
|
71
|
+
};
|
|
72
|
+
return new Promise((c, p) => {
|
|
73
|
+
const l = n.transaction(o, "readwrite").objectStore(o).put(r);
|
|
74
|
+
l.onsuccess = () => c(), l.onerror = () => p(l.error);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async has(e, s) {
|
|
78
|
+
return await this.get(e, s) !== null;
|
|
79
|
+
}
|
|
80
|
+
async invalidate(e, s) {
|
|
81
|
+
const t = await this.open();
|
|
82
|
+
return new Promise((a, n) => {
|
|
83
|
+
const r = t.transaction(o, "readwrite").objectStore(o).delete(u.cacheKey(e, s));
|
|
84
|
+
r.onsuccess = () => a(), r.onerror = () => n(r.error);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async invalidateAll(e) {
|
|
88
|
+
const s = await this.open();
|
|
89
|
+
return e ? new Promise((t, a) => {
|
|
90
|
+
const r = s.transaction(o, "readwrite").objectStore(o).index("modelName").openCursor(IDBKeyRange.only(e));
|
|
91
|
+
r.onsuccess = () => {
|
|
92
|
+
const c = r.result;
|
|
93
|
+
c ? (c.delete(), c.continue()) : t();
|
|
94
|
+
}, r.onerror = () => a(r.error);
|
|
95
|
+
}) : new Promise((t, a) => {
|
|
96
|
+
const i = s.transaction(o, "readwrite").objectStore(o).clear();
|
|
97
|
+
i.onsuccess = () => t(), i.onerror = () => a(i.error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async close() {
|
|
101
|
+
this._database && (this._database.close(), this._database = null, this._openPromise = null);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
14
104
|
export {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
105
|
+
T as ATTRIBUTES_META_KEY,
|
|
106
|
+
k as Adapter,
|
|
107
|
+
I as AdapterPopulatedRecordArray,
|
|
108
|
+
g as AsyncBelongsTo,
|
|
109
|
+
L as AsyncHasMany,
|
|
110
|
+
Z as BaseTransform,
|
|
111
|
+
ee as BooleanTransform,
|
|
112
|
+
oe as CacheHandler,
|
|
113
|
+
te as DateTransform,
|
|
114
|
+
G as EmbeddedRecordsMixin,
|
|
115
|
+
q as Errors,
|
|
116
|
+
ne as FetchHandler,
|
|
117
|
+
B as IdentityMap,
|
|
118
|
+
u as IndexedDBCache,
|
|
119
|
+
de as JsonApiAdapter,
|
|
120
|
+
ue as JsonApiSerializer,
|
|
121
|
+
Q as JsonSerializer,
|
|
122
|
+
b as MODEL_NAME_META_KEY,
|
|
123
|
+
D as ManyArray,
|
|
124
|
+
C as MemoryAdapter,
|
|
125
|
+
H as Model,
|
|
126
|
+
se as NumberTransform,
|
|
127
|
+
pe as ODataAdapter,
|
|
128
|
+
_ as RELATIONSHIPS_META_KEY,
|
|
129
|
+
me as RESPONSE_HEADERS,
|
|
130
|
+
J as RecordArray,
|
|
131
|
+
ce as RequestManager,
|
|
132
|
+
Y as RestAdapter,
|
|
133
|
+
W as RestSerializer,
|
|
134
|
+
P as SchemaService,
|
|
135
|
+
$ as Serializer,
|
|
136
|
+
K as Snapshot,
|
|
137
|
+
O as StateMachine,
|
|
138
|
+
z as Store,
|
|
139
|
+
ae as StringTransform,
|
|
140
|
+
Ae as attachResponseHeaders,
|
|
141
|
+
E as attr,
|
|
142
|
+
R as belongsTo,
|
|
143
|
+
fe as extractResponseHeaders,
|
|
144
|
+
w as hasMany,
|
|
145
|
+
ye as parseCacheTTLFromHeaders
|
|
51
146
|
};
|
|
52
147
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/cache/IndexedDBCache.ts"],"sourcesContent":["import type { RelationshipRef } from '@mobx-data/model';\nimport type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';\n\nconst STORE_NAME = 'cache-entries';\nconst DATABASE_VERSION = 1;\nconst DEFAULT_TTL = 3_600_000;\n\ninterface StoredEntry extends CacheEntryData {\n key: string;\n}\n\nexport class IndexedDBCache implements CacheLike {\n private _databaseName: string;\n\n private _defaultTTL: number;\n\n private _database: IDBDatabase | null = null;\n\n private _openPromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBCacheOptions = {}) {\n this._databaseName = options.databaseName ?? 'mobx-data-cache';\n this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;\n }\n\n get defaultTTL(): number {\n return this._defaultTTL;\n }\n\n private async open(): Promise<IDBDatabase> {\n if (this._database) {\n return this._database;\n }\n if (this._openPromise) {\n return this._openPromise;\n }\n\n this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this._databaseName, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n const store = database.createObjectStore(STORE_NAME, {\n keyPath: 'key',\n });\n store.createIndex('modelName', 'modelName', { unique: false });\n store.createIndex('expiresAt', 'expiresAt', { unique: false });\n }\n };\n request.onsuccess = () => {\n this._database = request.result;\n resolve(this._database);\n };\n request.onerror = () => {\n this._openPromise = null;\n reject(request.error);\n };\n });\n return this._openPromise;\n }\n\n static cacheKey(modelName: string, id: string): string {\n return `${modelName}:${id}`;\n }\n\n async get(modelName: string, id: string): Promise<CacheEntryData | null> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => {\n const entry = request.result as StoredEntry | undefined;\n if (!entry) {\n resolve(null);\n return;\n }\n if (Date.now() > entry.expiresAt) {\n this.invalidate(modelName, id);\n resolve(null);\n return;\n }\n resolve(entry);\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n async set(\n modelName: string,\n id: string,\n attributes: Record<string, unknown>,\n options: {\n relationships?: Record<string, RelationshipRef>;\n ttl?: number;\n } = {},\n ): Promise<void> {\n const database = await this.open();\n const now = Date.now();\n const ttl = options.ttl ?? this._defaultTTL;\n const entry: StoredEntry = {\n key: IndexedDBCache.cacheKey(modelName, id),\n modelName,\n id,\n attributes,\n relationships: options.relationships,\n cachedAt: now,\n expiresAt: now + ttl,\n };\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put(entry);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async has(modelName: string, id: string): Promise<boolean> {\n const entry = await this.get(modelName, id);\n return entry !== null;\n }\n\n async invalidate(modelName: string, id: string): Promise<void> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.delete(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async invalidateAll(modelName?: string): Promise<void> {\n const database = await this.open();\n if (!modelName) {\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index('modelName');\n const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n cursorRequest.onerror = () => reject(cursorRequest.error);\n });\n }\n\n async close(): Promise<void> {\n if (this._database) {\n this._database.close();\n this._database = null;\n this._openPromise = null;\n }\n }\n}\n"],"names":["STORE_NAME","DATABASE_VERSION","DEFAULT_TTL","IndexedDBCache","options","resolve","reject","request","database","store","modelName","id","entry","attributes","now","ttl","cursorRequest","cursor"],"mappings":"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"}
|
package/dist/json-api/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../JsonApiSerializer-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../JsonApiSerializer-Bc4iQB0d.cjs");Object.defineProperty(exports,"JsonApiAdapter",{enumerable:!0,get:()=>e.JsonApiAdapter});Object.defineProperty(exports,"JsonApiSerializer",{enumerable:!0,get:()=>e.JsonApiSerializer});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/json-api/index.js
CHANGED
package/dist/odata/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../ODataAdapter-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../ODataAdapter-lMifLyLD.cjs");Object.defineProperty(exports,"ODataAdapter",{enumerable:!0,get:()=>e.ODataAdapter});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/odata/index.js
CHANGED
package/dist/store/Store.d.ts
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { SchemaService, type RelationshipDef, type AttributeDef } from '@mobx-data/schema';
|
|
38
38
|
import { Model, type RelationshipRef, type ModelStoreLike, type SaveOptions } from '@mobx-data/model';
|
|
39
|
+
import type { CacheLike } from '../cache/types.js';
|
|
39
40
|
import { IdentityMap } from './IdentityMap.js';
|
|
40
41
|
import { RecordArray, AdapterPopulatedRecordArray } from './RecordArray.js';
|
|
41
42
|
/** Options forwarded from the Store to adapter fetch methods. */
|
|
@@ -127,11 +128,15 @@ export declare class Store implements ModelStoreLike {
|
|
|
127
128
|
private relationshipCache;
|
|
128
129
|
/** Tracks new records that have been appended to a hasMany but not yet saved. */
|
|
129
130
|
private pendingMembers;
|
|
131
|
+
/** Optional persistent cache layer (e.g. IndexedDB). */
|
|
132
|
+
private _cache;
|
|
130
133
|
constructor(schema: SchemaService);
|
|
131
134
|
/** Registers an adapter for a given model name (or `'application'` as a fallback). */
|
|
132
135
|
registerAdapter(modelName: string, adapter: AdapterLike): void;
|
|
133
136
|
/** Registers a serializer for a given model name (or `'application'` as a fallback). */
|
|
134
137
|
registerSerializer(modelName: string, serializer: SerializerLike): void;
|
|
138
|
+
/** Registers a persistent cache layer (e.g. IndexedDB) for offline-first reads. */
|
|
139
|
+
registerCache(cache: CacheLike): void;
|
|
135
140
|
/**
|
|
136
141
|
* Returns the adapter for `modelName`, falling back to `'application'`.
|
|
137
142
|
* @throws when no adapter is registered.
|
|
@@ -305,6 +310,7 @@ export declare class Store implements ModelStoreLike {
|
|
|
305
310
|
* the inverse. Pending members are removed from the pending set.
|
|
306
311
|
*/
|
|
307
312
|
_hasManyRemove(record: Model, name: string, meta: RelationshipDef, value: Model): void;
|
|
313
|
+
private cacheNormalizedDocument;
|
|
308
314
|
private coalescePending;
|
|
309
315
|
private coalesceScheduled;
|
|
310
316
|
private scheduleCoalescedFind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/store/Store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/store/Store.ts"],"names":[],"mappings":"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"}
|
package/dist/store/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../Store-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../Store-KvjmBTQ9.cjs");exports.AdapterPopulatedRecordArray=e.AdapterPopulatedRecordArray;exports.IdentityMap=e.IdentityMap;exports.RecordArray=e.RecordArray;Object.defineProperty(exports,"Store",{enumerable:!0,get:()=>e.Store});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/store/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iamjulianacosta/mobx-data",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Ember Data feature-complete clone for MobX",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"eslint-config-airbnb-typescript": "^18.0.0",
|
|
124
124
|
"eslint-import-resolver-typescript": "^3.7.0",
|
|
125
125
|
"eslint-plugin-import": "^2.31.0",
|
|
126
|
+
"fake-indexeddb": "^6.2.5",
|
|
126
127
|
"mobx": "^6.13.5",
|
|
127
128
|
"nyc": "^18.0.0",
|
|
128
129
|
"reflect-metadata": "^0.2.2",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
import { injectable } from 'tsyringe';
|
|
24
24
|
import { Adapter, type AdapterSnapshot } from './Adapter.js';
|
|
25
|
+
import { attachResponseHeaders } from '../cache/cache-utils.js';
|
|
25
26
|
|
|
26
27
|
@injectable()
|
|
27
28
|
export class RestAdapter extends Adapter {
|
|
@@ -104,11 +105,20 @@ export class RestAdapter extends Adapter {
|
|
|
104
105
|
if (!text) {
|
|
105
106
|
return null;
|
|
106
107
|
}
|
|
108
|
+
let result: unknown;
|
|
107
109
|
try {
|
|
108
|
-
|
|
110
|
+
result = JSON.parse(text);
|
|
109
111
|
} catch {
|
|
110
|
-
|
|
112
|
+
result = text;
|
|
111
113
|
}
|
|
114
|
+
if (result !== null && typeof result === 'object') {
|
|
115
|
+
const headers: Record<string, string> = {};
|
|
116
|
+
response.headers.forEach((value, key) => {
|
|
117
|
+
headers[key.toLowerCase()] = value;
|
|
118
|
+
});
|
|
119
|
+
attachResponseHeaders(result, headers);
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
112
122
|
}
|
|
113
123
|
|
|
114
124
|
override async findRecord(
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { RelationshipRef } from '@mobx-data/model';
|
|
2
|
+
import type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';
|
|
3
|
+
|
|
4
|
+
const STORE_NAME = 'cache-entries';
|
|
5
|
+
const DATABASE_VERSION = 1;
|
|
6
|
+
const DEFAULT_TTL = 3_600_000;
|
|
7
|
+
|
|
8
|
+
interface StoredEntry extends CacheEntryData {
|
|
9
|
+
key: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class IndexedDBCache implements CacheLike {
|
|
13
|
+
private _databaseName: string;
|
|
14
|
+
|
|
15
|
+
private _defaultTTL: number;
|
|
16
|
+
|
|
17
|
+
private _database: IDBDatabase | null = null;
|
|
18
|
+
|
|
19
|
+
private _openPromise: Promise<IDBDatabase> | null = null;
|
|
20
|
+
|
|
21
|
+
constructor(options: IndexedDBCacheOptions = {}) {
|
|
22
|
+
this._databaseName = options.databaseName ?? 'mobx-data-cache';
|
|
23
|
+
this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get defaultTTL(): number {
|
|
27
|
+
return this._defaultTTL;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private async open(): Promise<IDBDatabase> {
|
|
31
|
+
if (this._database) {
|
|
32
|
+
return this._database;
|
|
33
|
+
}
|
|
34
|
+
if (this._openPromise) {
|
|
35
|
+
return this._openPromise;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {
|
|
39
|
+
const request = indexedDB.open(this._databaseName, DATABASE_VERSION);
|
|
40
|
+
request.onupgradeneeded = () => {
|
|
41
|
+
const database = request.result;
|
|
42
|
+
if (!database.objectStoreNames.contains(STORE_NAME)) {
|
|
43
|
+
const store = database.createObjectStore(STORE_NAME, {
|
|
44
|
+
keyPath: 'key',
|
|
45
|
+
});
|
|
46
|
+
store.createIndex('modelName', 'modelName', { unique: false });
|
|
47
|
+
store.createIndex('expiresAt', 'expiresAt', { unique: false });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
request.onsuccess = () => {
|
|
51
|
+
this._database = request.result;
|
|
52
|
+
resolve(this._database);
|
|
53
|
+
};
|
|
54
|
+
request.onerror = () => {
|
|
55
|
+
this._openPromise = null;
|
|
56
|
+
reject(request.error);
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
return this._openPromise;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static cacheKey(modelName: string, id: string): string {
|
|
63
|
+
return `${modelName}:${id}`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async get(modelName: string, id: string): Promise<CacheEntryData | null> {
|
|
67
|
+
const database = await this.open();
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const transaction = database.transaction(STORE_NAME, 'readonly');
|
|
70
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
71
|
+
const request = store.get(IndexedDBCache.cacheKey(modelName, id));
|
|
72
|
+
request.onsuccess = () => {
|
|
73
|
+
const entry = request.result as StoredEntry | undefined;
|
|
74
|
+
if (!entry) {
|
|
75
|
+
resolve(null);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (Date.now() > entry.expiresAt) {
|
|
79
|
+
this.invalidate(modelName, id);
|
|
80
|
+
resolve(null);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
resolve(entry);
|
|
84
|
+
};
|
|
85
|
+
request.onerror = () => reject(request.error);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async set(
|
|
90
|
+
modelName: string,
|
|
91
|
+
id: string,
|
|
92
|
+
attributes: Record<string, unknown>,
|
|
93
|
+
options: {
|
|
94
|
+
relationships?: Record<string, RelationshipRef>;
|
|
95
|
+
ttl?: number;
|
|
96
|
+
} = {},
|
|
97
|
+
): Promise<void> {
|
|
98
|
+
const database = await this.open();
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const ttl = options.ttl ?? this._defaultTTL;
|
|
101
|
+
const entry: StoredEntry = {
|
|
102
|
+
key: IndexedDBCache.cacheKey(modelName, id),
|
|
103
|
+
modelName,
|
|
104
|
+
id,
|
|
105
|
+
attributes,
|
|
106
|
+
relationships: options.relationships,
|
|
107
|
+
cachedAt: now,
|
|
108
|
+
expiresAt: now + ttl,
|
|
109
|
+
};
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
112
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
113
|
+
const request = store.put(entry);
|
|
114
|
+
request.onsuccess = () => resolve();
|
|
115
|
+
request.onerror = () => reject(request.error);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async has(modelName: string, id: string): Promise<boolean> {
|
|
120
|
+
const entry = await this.get(modelName, id);
|
|
121
|
+
return entry !== null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async invalidate(modelName: string, id: string): Promise<void> {
|
|
125
|
+
const database = await this.open();
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
128
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
129
|
+
const request = store.delete(IndexedDBCache.cacheKey(modelName, id));
|
|
130
|
+
request.onsuccess = () => resolve();
|
|
131
|
+
request.onerror = () => reject(request.error);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async invalidateAll(modelName?: string): Promise<void> {
|
|
136
|
+
const database = await this.open();
|
|
137
|
+
if (!modelName) {
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
140
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
141
|
+
const request = store.clear();
|
|
142
|
+
request.onsuccess = () => resolve();
|
|
143
|
+
request.onerror = () => reject(request.error);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
148
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
149
|
+
const index = store.index('modelName');
|
|
150
|
+
const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));
|
|
151
|
+
cursorRequest.onsuccess = () => {
|
|
152
|
+
const cursor = cursorRequest.result;
|
|
153
|
+
if (cursor) {
|
|
154
|
+
cursor.delete();
|
|
155
|
+
cursor.continue();
|
|
156
|
+
} else {
|
|
157
|
+
resolve();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
cursorRequest.onerror = () => reject(cursorRequest.error);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async close(): Promise<void> {
|
|
165
|
+
if (this._database) {
|
|
166
|
+
this._database.close();
|
|
167
|
+
this._database = null;
|
|
168
|
+
this._openPromise = null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { RESPONSE_HEADERS } from './types.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_TTL = 3_600_000;
|
|
4
|
+
|
|
5
|
+
export function parseCacheTTLFromHeaders(headers: Record<string, string>): number {
|
|
6
|
+
const cacheControl = headers['cache-control'];
|
|
7
|
+
if (cacheControl) {
|
|
8
|
+
if (/no-store/i.test(cacheControl) || /no-cache/i.test(cacheControl)) {
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
const sMaxAge = /s-maxage=(\d+)/i.exec(cacheControl);
|
|
12
|
+
if (sMaxAge) {
|
|
13
|
+
return parseInt(sMaxAge[1]!, 10) * 1000;
|
|
14
|
+
}
|
|
15
|
+
const maxAge = /max-age=(\d+)/i.exec(cacheControl);
|
|
16
|
+
if (maxAge) {
|
|
17
|
+
return parseInt(maxAge[1]!, 10) * 1000;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const expires = headers['expires'];
|
|
22
|
+
if (expires) {
|
|
23
|
+
const expiresMilliseconds = new Date(expires).getTime();
|
|
24
|
+
if (!Number.isNaN(expiresMilliseconds)) {
|
|
25
|
+
return Math.max(0, expiresMilliseconds - Date.now());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return DEFAULT_TTL;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function extractResponseHeaders(
|
|
33
|
+
payload: unknown,
|
|
34
|
+
): Record<string, string> | null {
|
|
35
|
+
if (payload !== null && typeof payload === 'object') {
|
|
36
|
+
return (
|
|
37
|
+
(payload as Record<symbol, unknown>)[RESPONSE_HEADERS] as
|
|
38
|
+
| Record<string, string>
|
|
39
|
+
| undefined
|
|
40
|
+
) ?? null;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function attachResponseHeaders(
|
|
46
|
+
payload: unknown,
|
|
47
|
+
headers: Record<string, string>,
|
|
48
|
+
): void {
|
|
49
|
+
if (payload !== null && typeof payload === 'object') {
|
|
50
|
+
Object.defineProperty(payload, RESPONSE_HEADERS, {
|
|
51
|
+
value: headers,
|
|
52
|
+
enumerable: false,
|
|
53
|
+
writable: false,
|
|
54
|
+
configurable: false,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { IndexedDBCache } from './IndexedDBCache.js';
|
|
2
|
+
export {
|
|
3
|
+
type CacheEntryData,
|
|
4
|
+
type IndexedDBCacheOptions,
|
|
5
|
+
type CacheLike,
|
|
6
|
+
RESPONSE_HEADERS,
|
|
7
|
+
} from './types.js';
|
|
8
|
+
export {
|
|
9
|
+
parseCacheTTLFromHeaders,
|
|
10
|
+
extractResponseHeaders,
|
|
11
|
+
attachResponseHeaders,
|
|
12
|
+
} from './cache-utils.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RelationshipRef } from '@mobx-data/model';
|
|
2
|
+
|
|
3
|
+
export const RESPONSE_HEADERS: unique symbol = Symbol('response-headers');
|
|
4
|
+
|
|
5
|
+
export interface CacheEntryData {
|
|
6
|
+
modelName: string;
|
|
7
|
+
id: string;
|
|
8
|
+
attributes: Record<string, unknown>;
|
|
9
|
+
relationships?: Record<string, RelationshipRef>;
|
|
10
|
+
cachedAt: number;
|
|
11
|
+
expiresAt: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface IndexedDBCacheOptions {
|
|
15
|
+
databaseName?: string;
|
|
16
|
+
defaultTTL?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CacheLike {
|
|
20
|
+
get(modelName: string, id: string): Promise<CacheEntryData | null>;
|
|
21
|
+
set(
|
|
22
|
+
modelName: string,
|
|
23
|
+
id: string,
|
|
24
|
+
attributes: Record<string, unknown>,
|
|
25
|
+
options?: {
|
|
26
|
+
relationships?: Record<string, RelationshipRef>;
|
|
27
|
+
ttl?: number;
|
|
28
|
+
},
|
|
29
|
+
): Promise<void>;
|
|
30
|
+
has(modelName: string, id: string): Promise<boolean>;
|
|
31
|
+
invalidate(modelName: string, id: string): Promise<void>;
|
|
32
|
+
invalidateAll(modelName?: string): Promise<void>;
|
|
33
|
+
}
|