Skip to content

Commit 9fce447

Browse files
getifyMuaviyaImran
andcommitted
Adding 'many()' feature for 'get()', 'set()', and 'remove()' API methods
closes #5 closes #6 Squashed commit of the following: commit a32f35a3e61daf03418fce842b91e6b62143a347 Author: Kyle Simpson <[email protected]> Date: Thu Dec 19 10:57:01 2024 -0600 fixing/improving 'many' implementations from @MuaviyaImran per #6, improving tests, adding docs commit 5600326 Merge: 01ba6fc 71977a6 Author: Muaviya Imran <[email protected]> Date: Thu Dec 19 02:50:02 2024 +0500 Merge branch 'main' into f/enhancement-set-get-remove-many commit 01ba6fc Author: Muaviyaimran <[email protected]> Date: Thu Dec 19 02:49:04 2024 +0500 Removed commented code commit 47a087b Author: Muaviyaimran <[email protected]> Date: Thu Dec 19 02:43:53 2024 +0500 Added many.js commit 8eb84b2 Author: Muaviyaimran <[email protected]> Date: Thu Dec 19 02:29:42 2024 +0500 implemented getMany for local, session, idb and cookie commit c9a14a6 Author: Muaviyaimran <[email protected]> Date: Thu Dec 19 02:27:30 2024 +0500 Converted session, local and cookies to async functions commit 933697d Author: Muaviyaimran <[email protected]> Date: Thu Dec 19 02:10:23 2024 +0500 implemented setMany, and removeMany for local,session, idb and cookie Co-authored-by: Muaviyaimran <[email protected]> Co-authored-by: Kyle Simpson <[email protected]>
1 parent 71977a6 commit 9fce447

11 files changed

+265
-9
lines changed

README.md

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ If you are using a bundler (Astro, Vite, Webpack, etc) for your web application,
104104
Just `import` the adapter(s) of your choice, like so:
105105
106106
```js
107-
// {WHICHEVER}: "idb", "local-storage", etc
108-
import { get, set } from "@byojs/storage/{WHICHEVER}";
107+
// {TYPE}: "idb", "local-storage", etc
108+
import { get, set } from "@byojs/storage/{TYPE}";
109109
```
110110
111111
The bundler tool should pick up and find whatever files (and dependencies) are needed.
@@ -134,8 +134,8 @@ If you are not using a bundler (Astro, Vite, Webpack, etc) for your web applicat
134134
Now, you'll be able to `import` the library in your app in a friendly/readable way:
135135
136136
```js
137-
// {WHICHEVER}: "idb", "local-storage", etc
138-
import { get, set } from "storage/{WHICHEVER}";
137+
// {TYPE}: "idb", "local-storage", etc
138+
import { get, set } from "storage/{TYPE}";
139139
```
140140
141141
**Note:** If you omit the above *adapter* import-map entries, you can still `import` **Storage** by specifying the proper full path to whichever `adapter.*.mjs` file(s) you want to use.
@@ -148,7 +148,7 @@ The API provided by the **Storage** adapters can be accessed, for each adapter,
148148
149149
```js
150150
// for IndexedDB:
151-
import { has, get, set, remove } from "@byojs/storage/idb";
151+
import { has, get, set, remove } from "{..}/idb";
152152

153153
await has("Hello"); // false
154154

@@ -181,6 +181,70 @@ The key-value oriented methods available on each adapter's API are:
181181
182182
**NOTE:** All of these methods are async (promise-returning).
183183
184+
### Many API
185+
186+
The `get(..)`, `set(..)`, and `remove(..)` methods also support a bulk-call form, to process multiple keys/values at once:
187+
188+
```js
189+
// for IndexedDB:
190+
import { has, get, set, remove } from "{..}/idb";
191+
192+
var entries = [
193+
[ "Hello", "World!" ],
194+
[ "special", 42 ]
195+
];
196+
197+
await set.many(entries);
198+
// true
199+
200+
var keys = entries.map(([ key, val ]) => key);
201+
// [ "Hello", "special" ]
202+
203+
await get.many(keys);
204+
// [ "World!", 42 ]
205+
206+
await Promise.all(keys.map(has));
207+
// [ true, true ]
208+
209+
await remove.many(keys);
210+
// true
211+
212+
await Promise.all(keys.map(has));
213+
// [ false, false ]
214+
```
215+
216+
The `*.many(..)` methods also accept objects:
217+
218+
```js
219+
import { has, get, set, remove } from "{..}/idb";
220+
221+
var obj = {
222+
Hello: "World!",
223+
special: 42
224+
};
225+
226+
await set.many(obj);
227+
// true
228+
229+
var keysObj = {
230+
Hello: null,
231+
special: null
232+
};
233+
var keysArr = Object.keys(keys)
234+
235+
await get.many(keysObj);
236+
// [ "World!", 42 ]
237+
238+
await Promise.all(keysArr.map(has));
239+
// [ true, true ]
240+
241+
await remove.many(keysObj);
242+
// true
243+
244+
await Promise.all(keysArr.map(has));
245+
// [ false, false ]
246+
```
247+
184248
## Re-building `dist/*`
185249
186250
If you need to rebuild the `dist/*` files for any reason, run:

scripts/build-all.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async function main() {
5757
SRC_DIR,
5858
DIST_DIR,
5959
(contents,outputPath,filename = path.basename(outputPath)) => prepareFileContents(
60-
contents.replace(/(\.\/(util|worker\.opfs))\.js/g,"$1.mjs"),
60+
contents.replace(/(\.\/(util|many|worker\.opfs))\.js/g,"$1.mjs"),
6161
outputPath.replace(/\.js$/,".mjs"),
6262
filename.replace(/\.js$/,".mjs")
6363
),

src/adapter.cookie.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
import { safeJSONParse, } from "./util.js";
2+
import {
3+
setMany,
4+
getMany,
5+
removeMany,
6+
} from "./many.js";
7+
8+
9+
// ***********************
10+
11+
get.many = (...args) => getMany(get,...args);
12+
set.many = (...args) => setMany(set,...args);
13+
remove.many = (...args) => removeMany(remove,...args);
214

315

416
// ***********************

src/adapter.idb.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ import {
55
keys as idbKeys,
66
entries as idbEntries,
77
} from "idb-keyval";
8+
import {
9+
setMany,
10+
getMany,
11+
removeMany,
12+
} from "./many.js";
13+
14+
15+
// ***********************
16+
17+
get.many = (...args) => getMany(get,...args);
18+
set.many = (...args) => setMany(set,...args);
19+
remove.many = (...args) => removeMany(remove,...args);
820

921

1022
// ***********************

src/adapter.local-storage.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
import { safeJSONParse, } from "./util.js";
2+
import {
3+
setMany,
4+
getMany,
5+
removeMany,
6+
} from "./many.js";
7+
8+
9+
// ***********************
10+
11+
get.many = (...args) => getMany(get,...args);
12+
set.many = (...args) => setMany(set,...args);
13+
remove.many = (...args) => removeMany(remove,...args);
214

315

416
// ***********************
@@ -12,7 +24,7 @@ export {
1224
remove,
1325
keys,
1426
entries,
15-
}
27+
};
1628
var publicAPI = {
1729
storageType,
1830
has,
@@ -24,7 +36,6 @@ var publicAPI = {
2436
};
2537
export default publicAPI;
2638

27-
2839
// ***********************
2940

3041
async function has(name) {

src/adapter.opfs-worker.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ import {
55
} from "./util.js";
66

77

8+
// ***********************
9+
10+
get.many = async (...args) => (
11+
(await sendToWorker("get.many",...args))
12+
.map(safeJSONParse)
13+
);
14+
set.many = (...args) => sendToWorker("set.many",...args);
15+
remove.many = (...args) => sendToWorker("remove.many",...args);
16+
17+
818
// ***********************
919

1020
var worker = null;

src/adapter.opfs.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@ import {
33
isPromise,
44
getRootFS,
55
} from "./util.js";
6+
import {
7+
setMany,
8+
getMany,
9+
removeMany,
10+
} from "./many.js";
11+
12+
13+
// ***********************
14+
15+
get.many = (...args) => getMany(get,...args);
16+
set.many = (...args) => setMany(set,...args);
17+
remove.many = (...args) => removeMany(remove,...args);
618

719

820
// ***********************

src/adapter.session-storage.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
import { safeJSONParse, } from "./util.js";
2+
import {
3+
setMany,
4+
getMany,
5+
removeMany,
6+
} from "./many.js";
7+
8+
9+
// ***********************
10+
11+
get.many = (...args) => getMany(get,...args);
12+
set.many = (...args) => setMany(set,...args);
13+
remove.many = (...args) => removeMany(remove,...args);
214

315

416
// ***********************
@@ -12,7 +24,7 @@ export {
1224
remove,
1325
keys,
1426
entries,
15-
}
27+
};
1628
var publicAPI = {
1729
storageType,
1830
has,

src/many.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
export { setMany, getMany, removeMany };
2+
3+
4+
// ***********************
5+
6+
function setMany(set,entries) {
7+
// not already an entries-array?
8+
if (
9+
entries != null &&
10+
typeof entries == "object" &&
11+
!Array.isArray(entries)
12+
) {
13+
entries = [ ...Object.entries(entries), ];
14+
}
15+
return (
16+
Promise.all(
17+
entries.map(([ key, val ]) => set(key,val))
18+
)
19+
.then(() => true)
20+
);
21+
}
22+
23+
function getMany(get,keys) {
24+
// not already a keys-array?
25+
if (
26+
keys != null &&
27+
typeof keys == "object" &&
28+
!Array.isArray(keys)
29+
) {
30+
keys = [ ...Object.keys(keys), ];
31+
}
32+
return Promise.all(
33+
keys.map(key => get(key))
34+
);
35+
}
36+
37+
function removeMany(remove,keys) {
38+
// not already a keys-array?
39+
if (
40+
keys != null &&
41+
typeof keys == "object" &&
42+
!Array.isArray(keys)
43+
) {
44+
keys = [ ...Object.keys(keys), ];
45+
}
46+
return (
47+
Promise.all(
48+
keys.map(key => remove(key))
49+
)
50+
.then(() => true)
51+
);
52+
}

src/worker.opfs.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@ import {
22
isPromise,
33
getRootFS,
44
} from "./util.js";
5+
import {
6+
setMany,
7+
getMany,
8+
removeMany,
9+
} from "./many.js";
510

611

712
// ***********************
813

14+
get.many = (...args) => getMany(get,...args);
15+
set.many = (...args) => setMany(set,...args);
16+
remove.many = (...args) => removeMany(remove,...args);
17+
918
self.addEventListener("message",onMessage);
1019
self.postMessage({ "ready": true });
1120

@@ -16,8 +25,11 @@ async function onMessage({ data, } = {}) {
1625
var recognizedMessages = {
1726
has,
1827
get,
28+
"get.many": get.many,
1929
set,
30+
"set.many": set.many,
2031
remove,
32+
"remove.many": remove.many,
2133
keys,
2234
entries,
2335
};

0 commit comments

Comments
 (0)