|
2 | 2 | // // @ts-nocheck
|
3 | 3 | // Import the JoshProvider class.
|
4 | 4 | import {
|
5 |
| - ClearPayload, |
6 |
| - GetAllPayload, |
7 |
| - GetManyPayload, |
8 |
| - GetPayload, |
9 |
| - HasPayload, |
10 |
| - JoshProvider, |
11 |
| - Method, |
12 |
| - SetManyPayload, |
13 |
| - SetPayload, |
14 |
| - SizePayload |
| 5 | + ClearPayload, |
| 6 | + GetAllPayload, |
| 7 | + GetManyPayload, |
| 8 | + GetPayload, |
| 9 | + HasPayload, |
| 10 | + JoshProvider, |
| 11 | + Method, |
| 12 | + SetManyPayload, |
| 13 | + SetPayload, |
| 14 | + SizePayload |
15 | 15 | } from '@joshdb/core';
|
16 |
| -import { deleteFromObject, getFromObject, hasFromObject, setToObject } from '@realware/utilities'; |
| 16 | +import { getFromObject, hasFromObject, setToObject } from '@realware/utilities'; |
17 | 17 | import DbHandler from './DbHandler';
|
18 | 18 |
|
19 | 19 | // Create your provider class.
|
20 | 20 | export class IndexedDBProvider<StoredValue = unknown> extends JoshProvider<StoredValue> {
|
21 |
| - private db: DbHandler; |
22 |
| - public constructor(options: JoshProvider.Options) { |
23 |
| - super(options); |
24 |
| - this.db = new DbHandler(); |
25 |
| - } |
| 21 | + private db: DbHandler; |
| 22 | + public constructor(options: JoshProvider.Options) { |
| 23 | + super(options); |
| 24 | + this.db = new DbHandler(); |
| 25 | + } |
26 | 26 |
|
27 |
| - public async init(context: JoshProvider.Context<StoredValue>): Promise<JoshProvider.Context<StoredValue>> { |
28 |
| - context = await super.init(context); |
29 |
| - await this.db.init(); |
| 27 | + public async init(context: JoshProvider.Context<StoredValue>): Promise<JoshProvider.Context<StoredValue>> { |
| 28 | + context = await super.init(context); |
| 29 | + await this.db.init(); |
30 | 30 |
|
31 |
| - return context; |
32 |
| - } |
| 31 | + return context; |
| 32 | + } |
33 | 33 |
|
34 |
| - public async [Method.Get]<Value = StoredValue>(payload: GetPayload<Value>): Promise<GetPayload<Value>> { |
35 |
| - await this.check(); |
| 34 | + public async [Method.Get]<Value = StoredValue>(payload: GetPayload<Value>): Promise<GetPayload<Value>> { |
| 35 | + await this.check(); |
36 | 36 |
|
37 |
| - const { key, path } = payload; |
38 |
| - const value = await this.db.get(key); |
| 37 | + const { key, path } = payload; |
| 38 | + const value = await this.db.get(key); |
39 | 39 |
|
40 |
| - payload.data = path.length === 0 ? value : getFromObject(value, path); |
| 40 | + payload.data = path.length === 0 ? value : getFromObject(value, path); |
41 | 41 |
|
42 |
| - return payload; |
43 |
| - } |
| 42 | + return payload; |
| 43 | + } |
44 | 44 |
|
45 |
| - public async [Method.GetAll](payload: GetAllPayload<StoredValue>): Promise<GetAllPayload<StoredValue>> { |
46 |
| - await this.check(); |
| 45 | + public async [Method.GetAll](payload: GetAllPayload<StoredValue>): Promise<GetAllPayload<StoredValue>> { |
| 46 | + await this.check(); |
47 | 47 |
|
48 |
| - payload.data = await this.db.getAll(); |
| 48 | + payload.data = await this.db.getAll(); |
49 | 49 |
|
50 |
| - return payload; |
51 |
| - } |
| 50 | + return payload; |
| 51 | + } |
52 | 52 |
|
53 |
| - public async [Method.GetMany](payload: GetManyPayload<StoredValue>): Promise<GetManyPayload<StoredValue>> { |
54 |
| - await this.check(); |
55 |
| - // according to old method this could be made into an index search |
| 53 | + public async [Method.GetMany](payload: GetManyPayload<StoredValue>): Promise<GetManyPayload<StoredValue>> { |
| 54 | + await this.check(); |
| 55 | + // according to old method this could be made into an index search |
56 | 56 |
|
57 |
| - const { keys } = payload; |
| 57 | + const { keys } = payload; |
| 58 | + const data: { [key: string]: StoredValue } = await this.db.getAll(); |
58 | 59 |
|
59 |
| - const data: { [key: string]: StoredValue } = await this.db.getAll(); |
| 60 | + payload.data = {}; |
60 | 61 |
|
61 |
| - payload.data = {}; |
| 62 | + Object.entries(data).forEach(([key, val]) => { |
| 63 | + if (keys.includes(key)) { |
| 64 | + payload.data[key] = val; |
| 65 | + } |
| 66 | + }); |
62 | 67 |
|
63 |
| - Object.entries(data).forEach(([key, val]) => { |
64 |
| - if (keys.includes(key)) { |
65 |
| - payload.data[key] = val; |
66 |
| - } |
67 |
| - }); |
| 68 | + return payload; |
| 69 | + } |
68 | 70 |
|
69 |
| - return payload; |
70 |
| - } |
| 71 | + public async [Method.Set]<Value = StoredValue>(payload: SetPayload<Value>): Promise<SetPayload<Value>> { |
| 72 | + await this.check(); |
71 | 73 |
|
72 |
| - public async [Method.Set]<Value = StoredValue>(payload: SetPayload<Value>): Promise<SetPayload<Value>> { |
73 |
| - await this.check(); |
| 74 | + const { key, value, path } = payload; |
| 75 | + let data = (await this.db.get(key)) || {}; |
74 | 76 |
|
75 |
| - const { key, value, path } = payload; |
| 77 | + if (path.length === 0) { |
| 78 | + data = value; |
| 79 | + } else { |
| 80 | + setToObject(data, path, value); |
| 81 | + } |
76 | 82 |
|
77 |
| - let data = (await this.db.get(key)) || {}; |
| 83 | + await this.db.set(key, data); |
78 | 84 |
|
79 |
| - if (path.length === 0) { |
80 |
| - data = value; |
81 |
| - } else { |
82 |
| - setToObject(data, path, value); |
83 |
| - } |
| 85 | + return payload; |
| 86 | + } |
84 | 87 |
|
85 |
| - await this.db.set(key, data); |
| 88 | + public async [Method.SetMany](payload: SetManyPayload<StoredValue>): Promise<SetManyPayload<StoredValue>> { |
| 89 | + await this.check(); |
86 | 90 |
|
87 |
| - return payload; |
88 |
| - } |
| 91 | + const { keys, value } = payload; |
89 | 92 |
|
90 |
| - public async [Method.SetMany](payload: SetManyPayload<StoredValue>): Promise<SetManyPayload<StoredValue>> { |
91 |
| - await this.check(); |
| 93 | + for (const key of keys) { |
| 94 | + await this.set({ key, value, path: [], method: Method.Set }); |
| 95 | + // Incase overwrite is re-added. |
| 96 | + // const found = await this.get({ key, method: Method.Get, path: [] }); |
92 | 97 |
|
93 |
| - const { keys, value } = payload; |
| 98 | + // if (!found || (found && overwrite)) { |
| 99 | + // await this.set(key, null, val); |
| 100 | + // } |
| 101 | + } |
94 | 102 |
|
95 |
| - for (const key of keys) { |
96 |
| - await this.set({ key, value, path: [], method: Method.Set }); |
97 |
| - // Incase overwrite is re-added. |
98 |
| - // const found = await this.get({ key, method: Method.Get, path: [] }); |
| 103 | + return payload; |
| 104 | + } |
99 | 105 |
|
100 |
| - // if (!found || (found && overwrite)) { |
101 |
| - // await this.set(key, null, val); |
102 |
| - // } |
103 |
| - } |
| 106 | + public async [Method.Clear](payload: ClearPayload): Promise<ClearPayload> { |
| 107 | + await this.check(); |
| 108 | + await this.db.clear(); |
104 | 109 |
|
105 |
| - return payload; |
106 |
| - } |
| 110 | + return payload; |
| 111 | + } |
107 | 112 |
|
108 |
| - public async [Method.Clear](payload: ClearPayload): Promise<ClearPayload> { |
109 |
| - await this.check(); |
110 |
| - await this.db.clear(); |
| 113 | + public async [Method.Has](payload: HasPayload): Promise<HasPayload> { |
| 114 | + await this.check(); |
111 | 115 |
|
112 |
| - return payload; |
113 |
| - } |
| 116 | + const { key, path } = payload; |
114 | 117 |
|
115 |
| - public async [Method.Has](payload: HasPayload): Promise<HasPayload> { |
116 |
| - await this.check(); |
| 118 | + if (await this.db.has(key)) { |
| 119 | + payload.data = true; |
117 | 120 |
|
118 |
| - const { key, path } = payload; |
| 121 | + if (path.length !== 0) payload.data = hasFromObject(await this.db.get(key), path); |
| 122 | + } |
119 | 123 |
|
120 |
| - if (await this.db.has(key)) { |
121 |
| - payload.data = true; |
| 124 | + return payload; |
| 125 | + } |
122 | 126 |
|
123 |
| - if (path.length !== 0) payload.data = hasFromObject(await this.db.get(key), path); |
124 |
| - } |
| 127 | + public async [Method.Size](payload: SizePayload): Promise<SizePayload> { |
| 128 | + await this.check(); |
| 129 | + payload.data = await this.db.count(); |
125 | 130 |
|
126 |
| - return payload; |
127 |
| - } |
| 131 | + return payload; |
| 132 | + } |
128 | 133 |
|
129 |
| - public async [Method.Size](payload: SizePayload): Promise<SizePayload> { |
130 |
| - await this.check(); |
131 |
| - payload.data = await this.db.count(); |
| 134 | + private async check(key: string | null = null, type: string[] | null = null, path: string[] = []) { |
| 135 | + if (!this.db) throw new Error('Database has been closed'); |
| 136 | + if (!key || !type) return; |
132 | 137 |
|
133 |
| - return payload; |
134 |
| - } |
| 138 | + const value = await this.get({ method: Method.Get, key, path }); |
135 | 139 |
|
136 |
| - private async check(key: string | null = null, type: string[] | null = null, path: string[] = []) { |
137 |
| - if (!this.db) throw new Error('Database has been closed'); |
138 |
| - if (!key || !type) return; |
| 140 | + if (value === null) { |
| 141 | + throw new Error( |
| 142 | + `The document "${key}" of path "${path}" was not found in the database` |
| 143 | + // 'JoshTypeError', |
| 144 | + ); |
| 145 | + } |
139 | 146 |
|
140 |
| - const value = await this.get({ method: Method.Get, key, path }); |
| 147 | + const valueType = value.constructor.name; |
141 | 148 |
|
142 |
| - if (value === null) { |
143 |
| - throw new Error( |
144 |
| - `The document "${key}" of path "${path}" was not found in the database` |
145 |
| - // 'JoshTypeError', |
146 |
| - ); |
147 |
| - } |
148 |
| - |
149 |
| - const valueType = value.constructor.name; |
150 |
| - |
151 |
| - if (!type.includes(valueType)) { |
152 |
| - throw new Error( |
153 |
| - `The property ${path ? `${path} ` : ''}in key "${key}" is not of type "${type.join('" or "')}"(key was of type "${valueType}")` |
154 |
| - // 'JoshTypeError', |
155 |
| - ); |
156 |
| - } |
157 |
| - } |
| 149 | + if (!type.includes(valueType)) { |
| 150 | + throw new Error( |
| 151 | + `The property ${path ? `${path} ` : ''}in key "${key}" is not of type "${type.join('" or "')}"(key was of type "${valueType}")` |
| 152 | + // 'JoshTypeError', |
| 153 | + ); |
| 154 | + } |
| 155 | + } |
158 | 156 | }
|
0 commit comments