@vibes.diy/vibe-runtime 9.4.3 → 10.0.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/firefly-database.d.ts +0 -61
- package/firefly-database.js +25 -441
- package/firefly-database.js.map +1 -1
- package/indexeddb-store.d.ts +0 -1
- package/indexeddb-store.js +16 -5
- package/indexeddb-store.js.map +1 -1
- package/package.json +3 -3
- package/register-dependencies.js +1 -1
- package/register-dependencies.js.map +1 -1
- package/safe-local-storage.d.ts +1 -0
- package/safe-local-storage.js +14 -0
- package/safe-local-storage.js.map +1 -0
- package/use-firefly.d.ts +0 -50
- package/use-firefly.js +0 -521
- package/use-firefly.js.map +1 -1
- package/use-fireproof-local.d.ts +1 -2
- package/use-fireproof-local.js.map +1 -1
- package/viewer-identity-cache.d.ts +12 -0
- package/viewer-identity-cache.js +87 -0
- package/viewer-identity-cache.js.map +1 -0
- package/localfly.d.ts +0 -79
- package/localfly.js +0 -226
- package/localfly.js.map +0 -1
- package/read-cache.d.ts +0 -26
- package/read-cache.js +0 -230
- package/read-cache.js.map +0 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { exception2Result } from "@adviser/cement";
|
|
2
|
+
import { type } from "arktype";
|
|
3
|
+
import { safeLocalStorage } from "./safe-local-storage.js";
|
|
4
|
+
const VIEWER_IDENTITY_PREFIX = "flyviewerid";
|
|
5
|
+
const SIGNOUT_PREFIX = "flysignedout";
|
|
6
|
+
const viewerIdentitySchema = type({ userHandle: "string", "displayName?": "string" });
|
|
7
|
+
function viewerIdentityKey(appOrigin) {
|
|
8
|
+
return `${VIEWER_IDENTITY_PREFIX}:${appOrigin}`;
|
|
9
|
+
}
|
|
10
|
+
export function persistViewerIdentity(appOrigin, viewer) {
|
|
11
|
+
const storage = safeLocalStorage();
|
|
12
|
+
if (storage === undefined)
|
|
13
|
+
return;
|
|
14
|
+
const payload = {
|
|
15
|
+
userHandle: viewer.userHandle,
|
|
16
|
+
...(viewer.displayName !== undefined ? { displayName: viewer.displayName } : {}),
|
|
17
|
+
};
|
|
18
|
+
const serialized = exception2Result(() => JSON.stringify(payload));
|
|
19
|
+
if (serialized.isErr())
|
|
20
|
+
return;
|
|
21
|
+
exception2Result(() => storage.setItem(viewerIdentityKey(appOrigin), serialized.Ok()));
|
|
22
|
+
}
|
|
23
|
+
export function readPersistedViewerIdentity(appOrigin) {
|
|
24
|
+
if (isSignedOutMarked(appOrigin))
|
|
25
|
+
return undefined;
|
|
26
|
+
const storage = safeLocalStorage();
|
|
27
|
+
if (storage === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
const r = exception2Result(() => storage.getItem(viewerIdentityKey(appOrigin)));
|
|
30
|
+
if (r.isErr() || r.Ok() == null)
|
|
31
|
+
return undefined;
|
|
32
|
+
const parsed = exception2Result(() => JSON.parse(r.Ok()));
|
|
33
|
+
if (parsed.isErr())
|
|
34
|
+
return undefined;
|
|
35
|
+
const validated = viewerIdentitySchema(parsed.Ok());
|
|
36
|
+
if (validated instanceof type.errors)
|
|
37
|
+
return undefined;
|
|
38
|
+
return validated;
|
|
39
|
+
}
|
|
40
|
+
export function clearPersistedViewerIdentity(appOrigin) {
|
|
41
|
+
const storage = safeLocalStorage();
|
|
42
|
+
if (storage === undefined)
|
|
43
|
+
return;
|
|
44
|
+
exception2Result(() => storage.removeItem(viewerIdentityKey(appOrigin)));
|
|
45
|
+
}
|
|
46
|
+
export function cacheAppOrigin() {
|
|
47
|
+
const loc = globalThis.location;
|
|
48
|
+
return loc?.origin ?? "global";
|
|
49
|
+
}
|
|
50
|
+
function signOutMarkerKey(appOrigin) {
|
|
51
|
+
return `${SIGNOUT_PREFIX}:${appOrigin}`;
|
|
52
|
+
}
|
|
53
|
+
export function markSignedOut(appOrigin) {
|
|
54
|
+
const storage = safeLocalStorage();
|
|
55
|
+
if (storage === undefined)
|
|
56
|
+
return;
|
|
57
|
+
exception2Result(() => storage.setItem(signOutMarkerKey(appOrigin), "1"));
|
|
58
|
+
}
|
|
59
|
+
export function clearSignedOutMarker(appOrigin) {
|
|
60
|
+
const storage = safeLocalStorage();
|
|
61
|
+
if (storage === undefined)
|
|
62
|
+
return;
|
|
63
|
+
exception2Result(() => storage.removeItem(signOutMarkerKey(appOrigin)));
|
|
64
|
+
}
|
|
65
|
+
export function isSignedOutMarked(appOrigin) {
|
|
66
|
+
const storage = safeLocalStorage();
|
|
67
|
+
if (storage === undefined)
|
|
68
|
+
return true;
|
|
69
|
+
const r = exception2Result(() => storage.getItem(signOutMarkerKey(appOrigin)));
|
|
70
|
+
if (r.isErr())
|
|
71
|
+
return true;
|
|
72
|
+
return r.Ok() === "1";
|
|
73
|
+
}
|
|
74
|
+
export function clearAllCache() {
|
|
75
|
+
const storage = safeLocalStorage();
|
|
76
|
+
if (storage === undefined)
|
|
77
|
+
return;
|
|
78
|
+
const keys = [];
|
|
79
|
+
for (let i = 0; i < storage.length; i++) {
|
|
80
|
+
const k = storage.key(i);
|
|
81
|
+
if (k !== null && k.startsWith(`${VIEWER_IDENTITY_PREFIX}:`))
|
|
82
|
+
keys.push(k);
|
|
83
|
+
}
|
|
84
|
+
for (const k of keys)
|
|
85
|
+
exception2Result(() => storage.removeItem(k));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=viewer-identity-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-identity-cache.js","sourceRoot":"","sources":["../jsr/viewer-identity-cache.ts"],"names":[],"mappings":"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"}
|
package/localfly.d.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { type DocTypes, type DocWithId, type DocResponse, type QueryResponse, type QueryOpts, type MapFnArg, type IndexRow, type ListenerFn, type FireflyQueryDatabase } from "./firefly-database.js";
|
|
2
|
-
export declare function safeLocalStorage(): Storage | undefined;
|
|
3
|
-
export declare class Localfly implements FireflyQueryDatabase {
|
|
4
|
-
readonly name: string;
|
|
5
|
-
private readonly docs;
|
|
6
|
-
private readonly listeners;
|
|
7
|
-
private readonly storage?;
|
|
8
|
-
constructor(name: string, storage?: Storage | undefined);
|
|
9
|
-
private load;
|
|
10
|
-
private persist;
|
|
11
|
-
ready(): Promise<void>;
|
|
12
|
-
close(): Promise<void>;
|
|
13
|
-
destroy(): Promise<void>;
|
|
14
|
-
compact(): Promise<void>;
|
|
15
|
-
resubscribe(): void;
|
|
16
|
-
setOptimistic(_enabled: boolean): void;
|
|
17
|
-
get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;
|
|
18
|
-
put<T extends DocTypes>(doc: T & {
|
|
19
|
-
_id?: string;
|
|
20
|
-
}): Promise<DocResponse>;
|
|
21
|
-
del(id: string): Promise<DocResponse>;
|
|
22
|
-
remove(id: string): Promise<DocResponse>;
|
|
23
|
-
bulk<T extends DocTypes>(docs: (T & {
|
|
24
|
-
_id?: string;
|
|
25
|
-
})[]): Promise<{
|
|
26
|
-
ids: string[];
|
|
27
|
-
}>;
|
|
28
|
-
private snapshotDocs;
|
|
29
|
-
query<T extends DocTypes>(mapFn: MapFnArg<T>, opts?: QueryOpts): Promise<QueryResponse<T>>;
|
|
30
|
-
queryLive<T extends DocTypes>(mapFn: MapFnArg<T>, opts?: QueryOpts): Promise<{
|
|
31
|
-
result: QueryResponse<T>;
|
|
32
|
-
serverDocs: DocWithId<T>[];
|
|
33
|
-
}>;
|
|
34
|
-
materializeLive<T extends DocTypes>(serverDocs: DocWithId<T>[], mapFn: MapFnArg<T>, opts?: QueryOpts): QueryResponse<T>;
|
|
35
|
-
allDocs<T extends DocTypes>(opts?: {
|
|
36
|
-
limit?: number;
|
|
37
|
-
offset?: number;
|
|
38
|
-
descending?: boolean;
|
|
39
|
-
}): Promise<{
|
|
40
|
-
rows: IndexRow<T>[];
|
|
41
|
-
docs: DocWithId<T>[];
|
|
42
|
-
}>;
|
|
43
|
-
materializeAllDocs<T extends DocTypes>(serverDocs: DocWithId<T>[], opts?: {
|
|
44
|
-
limit?: number;
|
|
45
|
-
offset?: number;
|
|
46
|
-
descending?: boolean;
|
|
47
|
-
}): {
|
|
48
|
-
rows: IndexRow<T>[];
|
|
49
|
-
docs: DocWithId<T>[];
|
|
50
|
-
};
|
|
51
|
-
changes<T extends DocTypes>(): Promise<{
|
|
52
|
-
rows: IndexRow<T>[];
|
|
53
|
-
docs: DocWithId<T>[];
|
|
54
|
-
}>;
|
|
55
|
-
subscribe<T extends DocTypes>(listener: ListenerFn<T>, _updates?: boolean): () => void;
|
|
56
|
-
private notify;
|
|
57
|
-
snapshot<T extends DocTypes>(): DocWithId<T>[];
|
|
58
|
-
get size(): number;
|
|
59
|
-
clear(): void;
|
|
60
|
-
}
|
|
61
|
-
export declare function getOrCreateLocalDb(name: string): Localfly;
|
|
62
|
-
export type MigrateFn = (doc: DocWithId, userHandle: string) => Record<string, unknown> | null | undefined | false;
|
|
63
|
-
export declare function migrateLocalToCloud(localDb: Localfly, cloudDb: FireflyQueryDatabase, opts: {
|
|
64
|
-
userHandle: string;
|
|
65
|
-
migrate?: MigrateFn;
|
|
66
|
-
}): Promise<{
|
|
67
|
-
migrated: number;
|
|
68
|
-
dropped: number;
|
|
69
|
-
}>;
|
|
70
|
-
export declare function migrateLegacyAnonStore(args: {
|
|
71
|
-
name: string;
|
|
72
|
-
target: FireflyQueryDatabase;
|
|
73
|
-
userHandle?: string;
|
|
74
|
-
migrate?: MigrateFn;
|
|
75
|
-
storage?: Storage;
|
|
76
|
-
}): Promise<{
|
|
77
|
-
migrated: number;
|
|
78
|
-
dropped: number;
|
|
79
|
-
}>;
|
package/localfly.js
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { materializeQuery, newOptimisticId, } from "./firefly-database.js";
|
|
2
|
-
import { exception2Result, Result } from "@adviser/cement";
|
|
3
|
-
import { type } from "arktype";
|
|
4
|
-
const LOCAL_PREFIX = "firefly-anon";
|
|
5
|
-
const persistedDocs = type({ _id: "string" }).array();
|
|
6
|
-
const LEGACY_MIGRATION_VERSION = "v1";
|
|
7
|
-
function dbStorageKey(name) {
|
|
8
|
-
return `${LOCAL_PREFIX}:db:${name}`;
|
|
9
|
-
}
|
|
10
|
-
function legacyMigratedKey(name) {
|
|
11
|
-
return `${LOCAL_PREFIX}:legacy-migrated:${LEGACY_MIGRATION_VERSION}:${name}`;
|
|
12
|
-
}
|
|
13
|
-
export function safeLocalStorage() {
|
|
14
|
-
const probed = exception2Result(() => {
|
|
15
|
-
const s = globalThis.localStorage;
|
|
16
|
-
if (s === undefined)
|
|
17
|
-
return undefined;
|
|
18
|
-
const k = `${LOCAL_PREFIX}:probe`;
|
|
19
|
-
s.setItem(k, "1");
|
|
20
|
-
s.removeItem(k);
|
|
21
|
-
return s;
|
|
22
|
-
});
|
|
23
|
-
return probed.isErr() ? undefined : probed.Ok();
|
|
24
|
-
}
|
|
25
|
-
export class Localfly {
|
|
26
|
-
name;
|
|
27
|
-
docs = new Map();
|
|
28
|
-
listeners = new Set();
|
|
29
|
-
storage;
|
|
30
|
-
constructor(name, storage = safeLocalStorage()) {
|
|
31
|
-
this.name = name;
|
|
32
|
-
this.storage = storage;
|
|
33
|
-
this.load();
|
|
34
|
-
}
|
|
35
|
-
load() {
|
|
36
|
-
if (this.storage === undefined)
|
|
37
|
-
return;
|
|
38
|
-
const raw = this.storage.getItem(dbStorageKey(this.name));
|
|
39
|
-
if (raw === null)
|
|
40
|
-
return;
|
|
41
|
-
const parsed = exception2Result(() => JSON.parse(raw));
|
|
42
|
-
if (parsed.isErr())
|
|
43
|
-
return;
|
|
44
|
-
const validated = persistedDocs(parsed.Ok());
|
|
45
|
-
if (validated instanceof type.errors)
|
|
46
|
-
return;
|
|
47
|
-
for (const d of validated)
|
|
48
|
-
this.docs.set(d._id, d);
|
|
49
|
-
}
|
|
50
|
-
persist() {
|
|
51
|
-
if (this.storage === undefined)
|
|
52
|
-
return Result.Ok(undefined);
|
|
53
|
-
const wrote = exception2Result(() => this.storage?.setItem(dbStorageKey(this.name), JSON.stringify([...this.docs.values()])));
|
|
54
|
-
if (wrote.isErr()) {
|
|
55
|
-
const e = wrote.Err();
|
|
56
|
-
return Result.Err(new Error(`Failed to persist to local storage (quota exceeded / blocked): ${e instanceof Error ? e.message : String(e)}`, {
|
|
57
|
-
cause: e,
|
|
58
|
-
}));
|
|
59
|
-
}
|
|
60
|
-
return Result.Ok(undefined);
|
|
61
|
-
}
|
|
62
|
-
async ready() {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
async close() {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
async destroy() {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
async compact() {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
resubscribe() {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
setOptimistic(_enabled) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
async get(id) {
|
|
81
|
-
const doc = this.docs.get(id);
|
|
82
|
-
if (doc === undefined)
|
|
83
|
-
throw new Error(`Failed to get document: ${id} (not found)`);
|
|
84
|
-
return { ...doc };
|
|
85
|
-
}
|
|
86
|
-
async put(doc) {
|
|
87
|
-
const id = doc._id ?? newOptimisticId();
|
|
88
|
-
const saved = { ...doc, _id: id };
|
|
89
|
-
const prev = this.docs.get(id);
|
|
90
|
-
this.docs.set(id, saved);
|
|
91
|
-
const persisted = this.persist();
|
|
92
|
-
if (persisted.isErr()) {
|
|
93
|
-
if (prev === undefined)
|
|
94
|
-
this.docs.delete(id);
|
|
95
|
-
else
|
|
96
|
-
this.docs.set(id, prev);
|
|
97
|
-
throw persisted.Err();
|
|
98
|
-
}
|
|
99
|
-
this.notify([saved]);
|
|
100
|
-
return { id, ok: true };
|
|
101
|
-
}
|
|
102
|
-
async del(id) {
|
|
103
|
-
const prev = this.docs.get(id);
|
|
104
|
-
this.docs.delete(id);
|
|
105
|
-
const persisted = this.persist();
|
|
106
|
-
if (persisted.isErr()) {
|
|
107
|
-
if (prev !== undefined)
|
|
108
|
-
this.docs.set(id, prev);
|
|
109
|
-
throw persisted.Err();
|
|
110
|
-
}
|
|
111
|
-
this.notify([{ _id: id, _deleted: true }]);
|
|
112
|
-
return { id, ok: true };
|
|
113
|
-
}
|
|
114
|
-
async remove(id) {
|
|
115
|
-
return this.del(id);
|
|
116
|
-
}
|
|
117
|
-
async bulk(docs) {
|
|
118
|
-
const ids = [];
|
|
119
|
-
for (const doc of docs)
|
|
120
|
-
ids.push((await this.put(doc)).id);
|
|
121
|
-
return { ids };
|
|
122
|
-
}
|
|
123
|
-
snapshotDocs() {
|
|
124
|
-
return [...this.docs.values()].map((d) => ({ ...d }));
|
|
125
|
-
}
|
|
126
|
-
async query(mapFn, opts = {}) {
|
|
127
|
-
return materializeQuery(this.snapshotDocs(), mapFn, opts);
|
|
128
|
-
}
|
|
129
|
-
async queryLive(mapFn, opts = {}) {
|
|
130
|
-
const serverDocs = this.snapshotDocs();
|
|
131
|
-
return { result: materializeQuery(serverDocs, mapFn, opts), serverDocs };
|
|
132
|
-
}
|
|
133
|
-
materializeLive(serverDocs, mapFn, opts = {}) {
|
|
134
|
-
return materializeQuery(serverDocs, mapFn, opts);
|
|
135
|
-
}
|
|
136
|
-
async allDocs(opts = {}) {
|
|
137
|
-
return this.materializeAllDocs(this.snapshotDocs(), opts);
|
|
138
|
-
}
|
|
139
|
-
materializeAllDocs(serverDocs, opts = {}) {
|
|
140
|
-
let docs = [...serverDocs];
|
|
141
|
-
docs.sort((a, b) => (a._id < b._id ? -1 : a._id > b._id ? 1 : 0));
|
|
142
|
-
if (opts.descending)
|
|
143
|
-
docs.reverse();
|
|
144
|
-
if (opts.offset)
|
|
145
|
-
docs = docs.slice(opts.offset);
|
|
146
|
-
if (opts.limit !== undefined)
|
|
147
|
-
docs = docs.slice(0, opts.limit);
|
|
148
|
-
const rows = docs.map((doc) => ({ key: doc._id, value: doc, doc }));
|
|
149
|
-
return { rows, docs };
|
|
150
|
-
}
|
|
151
|
-
async changes() {
|
|
152
|
-
return { rows: [], docs: [] };
|
|
153
|
-
}
|
|
154
|
-
subscribe(listener, _updates) {
|
|
155
|
-
const fn = listener;
|
|
156
|
-
this.listeners.add(fn);
|
|
157
|
-
return () => {
|
|
158
|
-
this.listeners.delete(fn);
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
notify(docs, meta) {
|
|
162
|
-
for (const fn of this.listeners) {
|
|
163
|
-
const r = exception2Result(() => (meta === undefined ? fn(docs) : fn(docs, meta)));
|
|
164
|
-
if (r.isErr())
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
snapshot() {
|
|
169
|
-
return this.snapshotDocs();
|
|
170
|
-
}
|
|
171
|
-
get size() {
|
|
172
|
-
return this.docs.size;
|
|
173
|
-
}
|
|
174
|
-
clear() {
|
|
175
|
-
this.docs.clear();
|
|
176
|
-
if (this.storage !== undefined) {
|
|
177
|
-
exception2Result(() => this.storage?.removeItem(dbStorageKey(this.name)));
|
|
178
|
-
}
|
|
179
|
-
this.notify([]);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
const localDbCache = new Map();
|
|
183
|
-
export function getOrCreateLocalDb(name) {
|
|
184
|
-
let db = localDbCache.get(name);
|
|
185
|
-
if (db === undefined) {
|
|
186
|
-
db = new Localfly(name);
|
|
187
|
-
localDbCache.set(name, db);
|
|
188
|
-
}
|
|
189
|
-
return db;
|
|
190
|
-
}
|
|
191
|
-
export async function migrateLocalToCloud(localDb, cloudDb, opts) {
|
|
192
|
-
const { userHandle, migrate } = opts;
|
|
193
|
-
const docs = localDb.snapshot();
|
|
194
|
-
if (docs.length === 0)
|
|
195
|
-
return { migrated: 0, dropped: 0 };
|
|
196
|
-
let migrated = 0;
|
|
197
|
-
let dropped = 0;
|
|
198
|
-
for (const doc of docs) {
|
|
199
|
-
const out = migrate !== undefined ? migrate(doc, userHandle) : doc;
|
|
200
|
-
if (out === false || out === null || out === undefined) {
|
|
201
|
-
dropped++;
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
await cloudDb.put(out);
|
|
205
|
-
migrated++;
|
|
206
|
-
}
|
|
207
|
-
localDb.clear();
|
|
208
|
-
return { migrated, dropped };
|
|
209
|
-
}
|
|
210
|
-
export async function migrateLegacyAnonStore(args) {
|
|
211
|
-
const storage = args.storage ?? safeLocalStorage();
|
|
212
|
-
const alreadyDone = exception2Result(() => storage?.getItem(legacyMigratedKey(args.name)) === "1");
|
|
213
|
-
if (alreadyDone.isOk() && alreadyDone.Ok() === true)
|
|
214
|
-
return { migrated: 0, dropped: 0 };
|
|
215
|
-
const legacy = new Localfly(args.name, storage);
|
|
216
|
-
const markDone = () => exception2Result(() => storage?.setItem(legacyMigratedKey(args.name), "1"));
|
|
217
|
-
if (legacy.size === 0) {
|
|
218
|
-
markDone();
|
|
219
|
-
return { migrated: 0, dropped: 0 };
|
|
220
|
-
}
|
|
221
|
-
const opts = args.userHandle === undefined ? { userHandle: "", migrate: undefined } : { userHandle: args.userHandle, migrate: args.migrate };
|
|
222
|
-
const out = await migrateLocalToCloud(legacy, args.target, opts);
|
|
223
|
-
markDone();
|
|
224
|
-
return out;
|
|
225
|
-
}
|
|
226
|
-
//# sourceMappingURL=localfly.js.map
|
package/localfly.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"localfly.js","sourceRoot":"","sources":["../jsr/localfly.ts"],"names":[],"mappings":"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"}
|
package/read-cache.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { DocWithId } from "./firefly-database.js";
|
|
2
|
-
export interface PersistedViewerIdentity {
|
|
3
|
-
readonly userHandle: string;
|
|
4
|
-
readonly displayName?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function queryHash(mapFnString: string, queryString: string): string;
|
|
7
|
-
export interface QueryCacheKeyArgs {
|
|
8
|
-
viewerKey: string;
|
|
9
|
-
dbName: string;
|
|
10
|
-
mapFnString: string;
|
|
11
|
-
queryString: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function queryCacheKey({ viewerKey, dbName, mapFnString, queryString }: QueryCacheKeyArgs): string;
|
|
14
|
-
export declare function docCacheKey(viewerKey: string, dbName: string, docId: string): string;
|
|
15
|
-
export declare function readCacheEntry(key: string): DocWithId[] | undefined;
|
|
16
|
-
export declare function writeCacheEntry(key: string, docs: DocWithId[]): void;
|
|
17
|
-
export declare function clearAllCache(): void;
|
|
18
|
-
export declare function persistViewerIdentity(appOrigin: string, viewer: PersistedViewerIdentity): void;
|
|
19
|
-
export declare function readPersistedViewerIdentity(appOrigin: string): PersistedViewerIdentity | undefined;
|
|
20
|
-
export declare function clearPersistedViewerIdentity(appOrigin: string): void;
|
|
21
|
-
export declare function persistViewerKey(appOrigin: string, viewerKey: string): void;
|
|
22
|
-
export declare function readLastViewerKey(appOrigin: string): string | undefined;
|
|
23
|
-
export declare function cacheAppOrigin(): string;
|
|
24
|
-
export declare function markSignedOut(appOrigin: string): void;
|
|
25
|
-
export declare function clearSignedOutMarker(appOrigin: string): void;
|
|
26
|
-
export declare function isSignedOutMarked(appOrigin: string): boolean;
|
package/read-cache.js
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { exception2Result } from "@adviser/cement";
|
|
2
|
-
import { type } from "arktype";
|
|
3
|
-
import { safeLocalStorage } from "./localfly.js";
|
|
4
|
-
const CACHE_PREFIX = "flycache";
|
|
5
|
-
const VIEWER_PREFIX = "flyviewer";
|
|
6
|
-
const VIEWER_IDENTITY_PREFIX = "flyviewerid";
|
|
7
|
-
const SIGNOUT_PREFIX = "flysignedout";
|
|
8
|
-
const SCHEMA_VERSION = 1;
|
|
9
|
-
const TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
10
|
-
const MAX_ENTRY_BYTES = 256 * 1024;
|
|
11
|
-
const cacheEntrySchema = type({
|
|
12
|
-
v: "number",
|
|
13
|
-
savedAt: "number",
|
|
14
|
-
docs: type({ _id: "string" }).array(),
|
|
15
|
-
});
|
|
16
|
-
const viewerIdentitySchema = type({ userHandle: "string", "displayName?": "string" });
|
|
17
|
-
function isBinary(v) {
|
|
18
|
-
if (typeof Blob !== "undefined" && v instanceof Blob)
|
|
19
|
-
return true;
|
|
20
|
-
if (typeof File !== "undefined" && v instanceof File)
|
|
21
|
-
return true;
|
|
22
|
-
if (typeof ArrayBuffer !== "undefined" && v instanceof ArrayBuffer)
|
|
23
|
-
return true;
|
|
24
|
-
if (ArrayBuffer.isView(v))
|
|
25
|
-
return true;
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
function stripFiles(doc) {
|
|
29
|
-
const files = doc._files;
|
|
30
|
-
if (files === null || typeof files !== "object")
|
|
31
|
-
return doc;
|
|
32
|
-
const cleanedFiles = {};
|
|
33
|
-
for (const [key, meta] of Object.entries(files)) {
|
|
34
|
-
if (meta === null || typeof meta !== "object") {
|
|
35
|
-
cleanedFiles[key] = meta;
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const out = {};
|
|
39
|
-
for (const [mk, mv] of Object.entries(meta)) {
|
|
40
|
-
if (mk === "file")
|
|
41
|
-
continue;
|
|
42
|
-
if (isBinary(mv))
|
|
43
|
-
continue;
|
|
44
|
-
out[mk] = mv;
|
|
45
|
-
}
|
|
46
|
-
cleanedFiles[key] = out;
|
|
47
|
-
}
|
|
48
|
-
return { ...doc, _files: cleanedFiles };
|
|
49
|
-
}
|
|
50
|
-
function parseSavedAt(storage, key) {
|
|
51
|
-
const raw = exception2Result(() => storage.getItem(key));
|
|
52
|
-
if (raw.isErr() || raw.Ok() == null)
|
|
53
|
-
return 0;
|
|
54
|
-
const parsed = exception2Result(() => JSON.parse(raw.Ok()));
|
|
55
|
-
if (parsed.isErr())
|
|
56
|
-
return 0;
|
|
57
|
-
const savedAt = parsed.Ok().savedAt;
|
|
58
|
-
return typeof savedAt === "number" ? savedAt : 0;
|
|
59
|
-
}
|
|
60
|
-
function evictOldest(storage, exceptKey) {
|
|
61
|
-
let oldestKey;
|
|
62
|
-
let oldestAt = Infinity;
|
|
63
|
-
for (let i = 0; i < storage.length; i++) {
|
|
64
|
-
const k = storage.key(i);
|
|
65
|
-
if (k === null || !k.startsWith(`${CACHE_PREFIX}:`) || k === exceptKey)
|
|
66
|
-
continue;
|
|
67
|
-
const at = parseSavedAt(storage, k);
|
|
68
|
-
if (at < oldestAt) {
|
|
69
|
-
oldestAt = at;
|
|
70
|
-
oldestKey = k;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (oldestKey === undefined)
|
|
74
|
-
return false;
|
|
75
|
-
exception2Result(() => storage.removeItem(oldestKey));
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
export function queryHash(mapFnString, queryString) {
|
|
79
|
-
const s = `${mapFnString}\n${queryString}`;
|
|
80
|
-
let h = 0x811c9dc5;
|
|
81
|
-
for (let i = 0; i < s.length; i++) {
|
|
82
|
-
h ^= s.charCodeAt(i);
|
|
83
|
-
h = Math.imul(h, 0x01000193);
|
|
84
|
-
}
|
|
85
|
-
return (h >>> 0).toString(36);
|
|
86
|
-
}
|
|
87
|
-
export function queryCacheKey({ viewerKey, dbName, mapFnString, queryString }) {
|
|
88
|
-
return `${CACHE_PREFIX}:${viewerKey}:${dbName}:${queryHash(mapFnString, queryString)}`;
|
|
89
|
-
}
|
|
90
|
-
export function docCacheKey(viewerKey, dbName, docId) {
|
|
91
|
-
return `${CACHE_PREFIX}:${viewerKey}:${dbName}:${queryHash("__doc__", docId)}`;
|
|
92
|
-
}
|
|
93
|
-
export function readCacheEntry(key) {
|
|
94
|
-
const storage = safeLocalStorage();
|
|
95
|
-
if (storage === undefined)
|
|
96
|
-
return undefined;
|
|
97
|
-
const raw = exception2Result(() => storage.getItem(key));
|
|
98
|
-
if (raw.isErr() || raw.Ok() == null)
|
|
99
|
-
return undefined;
|
|
100
|
-
const parsed = exception2Result(() => JSON.parse(raw.Ok()));
|
|
101
|
-
if (parsed.isErr())
|
|
102
|
-
return undefined;
|
|
103
|
-
const validated = cacheEntrySchema(parsed.Ok());
|
|
104
|
-
if (validated instanceof type.errors)
|
|
105
|
-
return undefined;
|
|
106
|
-
if (validated.v !== SCHEMA_VERSION)
|
|
107
|
-
return undefined;
|
|
108
|
-
if (Date.now() - validated.savedAt > TTL_MS)
|
|
109
|
-
return undefined;
|
|
110
|
-
return validated.docs;
|
|
111
|
-
}
|
|
112
|
-
export function writeCacheEntry(key, docs) {
|
|
113
|
-
const storage = safeLocalStorage();
|
|
114
|
-
if (storage === undefined)
|
|
115
|
-
return;
|
|
116
|
-
const entry = { v: SCHEMA_VERSION, savedAt: Date.now(), docs: docs.map(stripFiles) };
|
|
117
|
-
const serialized = exception2Result(() => JSON.stringify(entry));
|
|
118
|
-
if (serialized.isErr())
|
|
119
|
-
return;
|
|
120
|
-
const payload = serialized.Ok();
|
|
121
|
-
if (payload.length > MAX_ENTRY_BYTES)
|
|
122
|
-
return;
|
|
123
|
-
const wrote = exception2Result(() => storage.setItem(key, payload));
|
|
124
|
-
if (wrote.isOk())
|
|
125
|
-
return;
|
|
126
|
-
if (evictOldest(storage, key)) {
|
|
127
|
-
exception2Result(() => storage.setItem(key, payload));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
export function clearAllCache() {
|
|
131
|
-
const storage = safeLocalStorage();
|
|
132
|
-
if (storage === undefined)
|
|
133
|
-
return;
|
|
134
|
-
const keys = [];
|
|
135
|
-
for (let i = 0; i < storage.length; i++) {
|
|
136
|
-
const k = storage.key(i);
|
|
137
|
-
if (k !== null &&
|
|
138
|
-
(k.startsWith(`${CACHE_PREFIX}:`) || k.startsWith(`${VIEWER_PREFIX}:`) || k.startsWith(`${VIEWER_IDENTITY_PREFIX}:`)))
|
|
139
|
-
keys.push(k);
|
|
140
|
-
}
|
|
141
|
-
for (const k of keys)
|
|
142
|
-
exception2Result(() => storage.removeItem(k));
|
|
143
|
-
}
|
|
144
|
-
function viewerIdentityKey(appOrigin) {
|
|
145
|
-
return `${VIEWER_IDENTITY_PREFIX}:${appOrigin}`;
|
|
146
|
-
}
|
|
147
|
-
export function persistViewerIdentity(appOrigin, viewer) {
|
|
148
|
-
const storage = safeLocalStorage();
|
|
149
|
-
if (storage === undefined)
|
|
150
|
-
return;
|
|
151
|
-
const payload = {
|
|
152
|
-
userHandle: viewer.userHandle,
|
|
153
|
-
...(viewer.displayName !== undefined ? { displayName: viewer.displayName } : {}),
|
|
154
|
-
};
|
|
155
|
-
const serialized = exception2Result(() => JSON.stringify(payload));
|
|
156
|
-
if (serialized.isErr())
|
|
157
|
-
return;
|
|
158
|
-
exception2Result(() => storage.setItem(viewerIdentityKey(appOrigin), serialized.Ok()));
|
|
159
|
-
}
|
|
160
|
-
export function readPersistedViewerIdentity(appOrigin) {
|
|
161
|
-
if (isSignedOutMarked(appOrigin))
|
|
162
|
-
return undefined;
|
|
163
|
-
const storage = safeLocalStorage();
|
|
164
|
-
if (storage === undefined)
|
|
165
|
-
return undefined;
|
|
166
|
-
const r = exception2Result(() => storage.getItem(viewerIdentityKey(appOrigin)));
|
|
167
|
-
if (r.isErr() || r.Ok() == null)
|
|
168
|
-
return undefined;
|
|
169
|
-
const parsed = exception2Result(() => JSON.parse(r.Ok()));
|
|
170
|
-
if (parsed.isErr())
|
|
171
|
-
return undefined;
|
|
172
|
-
const validated = viewerIdentitySchema(parsed.Ok());
|
|
173
|
-
if (validated instanceof type.errors)
|
|
174
|
-
return undefined;
|
|
175
|
-
return validated;
|
|
176
|
-
}
|
|
177
|
-
export function clearPersistedViewerIdentity(appOrigin) {
|
|
178
|
-
const storage = safeLocalStorage();
|
|
179
|
-
if (storage === undefined)
|
|
180
|
-
return;
|
|
181
|
-
exception2Result(() => storage.removeItem(viewerIdentityKey(appOrigin)));
|
|
182
|
-
}
|
|
183
|
-
function viewerStoreKey(appOrigin) {
|
|
184
|
-
return `${VIEWER_PREFIX}:${appOrigin}`;
|
|
185
|
-
}
|
|
186
|
-
export function persistViewerKey(appOrigin, viewerKey) {
|
|
187
|
-
const storage = safeLocalStorage();
|
|
188
|
-
if (storage === undefined)
|
|
189
|
-
return;
|
|
190
|
-
exception2Result(() => storage.setItem(viewerStoreKey(appOrigin), viewerKey));
|
|
191
|
-
}
|
|
192
|
-
export function readLastViewerKey(appOrigin) {
|
|
193
|
-
const storage = safeLocalStorage();
|
|
194
|
-
if (storage === undefined)
|
|
195
|
-
return undefined;
|
|
196
|
-
const r = exception2Result(() => storage.getItem(viewerStoreKey(appOrigin)));
|
|
197
|
-
if (r.isErr())
|
|
198
|
-
return undefined;
|
|
199
|
-
const v = r.Ok();
|
|
200
|
-
return v == null ? undefined : v;
|
|
201
|
-
}
|
|
202
|
-
export function cacheAppOrigin() {
|
|
203
|
-
const loc = globalThis.location;
|
|
204
|
-
return loc?.origin ?? "global";
|
|
205
|
-
}
|
|
206
|
-
function signOutMarkerKey(appOrigin) {
|
|
207
|
-
return `${SIGNOUT_PREFIX}:${appOrigin}`;
|
|
208
|
-
}
|
|
209
|
-
export function markSignedOut(appOrigin) {
|
|
210
|
-
const storage = safeLocalStorage();
|
|
211
|
-
if (storage === undefined)
|
|
212
|
-
return;
|
|
213
|
-
exception2Result(() => storage.setItem(signOutMarkerKey(appOrigin), "1"));
|
|
214
|
-
}
|
|
215
|
-
export function clearSignedOutMarker(appOrigin) {
|
|
216
|
-
const storage = safeLocalStorage();
|
|
217
|
-
if (storage === undefined)
|
|
218
|
-
return;
|
|
219
|
-
exception2Result(() => storage.removeItem(signOutMarkerKey(appOrigin)));
|
|
220
|
-
}
|
|
221
|
-
export function isSignedOutMarked(appOrigin) {
|
|
222
|
-
const storage = safeLocalStorage();
|
|
223
|
-
if (storage === undefined)
|
|
224
|
-
return true;
|
|
225
|
-
const r = exception2Result(() => storage.getItem(signOutMarkerKey(appOrigin)));
|
|
226
|
-
if (r.isErr())
|
|
227
|
-
return true;
|
|
228
|
-
return r.Ok() === "1";
|
|
229
|
-
}
|
|
230
|
-
//# sourceMappingURL=read-cache.js.map
|