📄 src/models/indexdb/book_data.ts
D-OPEN SOVEREIGN
1/*
2 * Copyright (c) 2026 DataPond D-Library Pty Ltd. ("The Sanctuary")
3 * Non-Profit Public Library — The World Library
4 * 
5 * D-SAFE Certification issued by POND Enterprise.
6 * Published under the D-Open Code Sovereign Licence v1.0 framework
7 * DataPond D-Library All exclusive Right reserved on modifiying the code - CC Attribution to data pond, Non modifiable, Non Commercial.
8 * https://registry.world.bibliotech.com/licence
9 * Source code donated to DataPond D-Library by it's author: data pond.
10 * 
11 * Technical Guardian ("The Shield"): Pond Enterprise Pty Ltd. (ACN 694 747 987)
12 * All liability claims about D-SAFE certification issues coming from the published D-Safe direction must be addressed with Pond Enterprise Pty Ltd.
13 * Code Modification automatically voids the certified liability protection provided by Pond Enterprise.
14 */
15import {proResolver} from "../promises.ts";
16import type {  BookData} from "./../interfaces.ts"
17import {Db, pdfDataStoreName} from "./common";
18
19export const hasBookData = (fileId:string): Promise<boolean> => {
20    const deferred = proResolver<boolean>()
21    Db().then(db => {
22        try {
23            const tx = db.transaction(pdfDataStoreName, "readonly");
24            const req = tx.objectStore(pdfDataStoreName).openCursor(fileId);
25            req.onsuccess = function (e) {
26                // @ts-ignore
27                const cursor = e.target.result;
28                if (cursor) { // key already exist
29                    deferred.resolve(true)
30                } else { // key not exist
31                    deferred.resolve(false)
32                }
33            };
34            req.onerror = function (e) {
35                console.error("worker: error", e.target)
36                deferred.reject(e.target)
37            }
38        } catch(e) {
39            console.error(e);
40            debugger
41        }
42    }).catch(e => {
43        console.error(`[indexdb error:] hasFile(): ${e.message}`)
44        deferred.reject(e)
45    });
46    return deferred.pro
47}
48
49export const loadBookData = (fileId: string) : Promise<BookData | undefined> => {
50    const deferred = proResolver<BookData | undefined>()
51    Db().then(db => {
52        const tx = db.transaction(pdfDataStoreName, "readonly");
53        let result: BookData | undefined = undefined;
54        tx.objectStore(pdfDataStoreName).get(fileId).addEventListener("success", function (event) {
55            // @ts-ignore
56            result = event.target.result;
57        });
58        tx.oncomplete = function () {
59            deferred.resolve(result);
60        };
61        tx.onerror = function (event) {
62            deferred.reject(event.target)
63        };
64    }).catch(deferred.reject)
65    return deferred.pro
66}
67
68
69export const storeBookData = (record: BookData) : Promise<boolean> => {
70    const deferred = proResolver<boolean>()
71    Db().then(async(db) => {
72        const has = await hasBookData(record.fileId)
73        const tx = db.transaction(pdfDataStoreName, "readwrite");
74        if (has) {
75            // @ts-ignore
76            tx.objectStore(pdfDataStoreName).put(record)
77        } else {
78            // @ts-ignore
79            tx.objectStore(pdfDataStoreName).add(record)
80        }
81        tx.oncomplete = function () {
82            deferred.resolve(true)
83        };
84        tx.onerror = function (event) {
85            console.error("worker: error", event.target)
86            deferred.reject(event.target)
87        };
88    }).catch(deferred.reject)
89    return deferred.pro
90}