- From: Nolan Lawson <notifications@github.com>
- Date: Mon, 23 Aug 2021 07:19:29 -0700
- To: w3c/IndexedDB <IndexedDB@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/IndexedDB/issues/224/903817561@github.com>
Given that `putAll()` is no longer in development (https://github.com/w3c/IndexedDB/issues/69#issuecomment-898619783), I like the idea of directly streaming JSON into an object store. As mentioned before, this won't handle Dates, but in retrospect I think this may be an edge case. My hunch is that most folks are storing objects in IndexedDB that are fully serializable as JSON. (I have no data though. :grinning:)
Something like this?
```js
const reader = (await (await fetch('./array.json')).body).getReader()
const writer = db.getWriter('my_object_store') // WritableStream
await reader.pipeTo(writer)
```
`db.getWriter()` could assume a `'readwrite'` transaction, and it could take an options bag like `db.transaction()`:
```js
const writer = db.getWriter('my_object_store', { durability: 'relaxed' })
```
Working with the existing `db.transaction()` is also possible, but it may be weird to get the microtask timing right, given that we are reading data from the network. Also making it more high-level gives more flexibility to the engine to optimize stuff (maybe?).
If we wanted to support Dates in the future, we could also always have an optional transform or something:
```js
const writer = db.getWriter('my_object_store', { transform: item => {
// transform a single item from the JSON array
item.date = new Date(item.date) // parse string to Date
return item
}})
```
(Maybe something like [module blocks](https://github.com/tc39/proposal-js-module-blocks) could even make it so that this `transform` function can run off-main-thread.)
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/IndexedDB/issues/224#issuecomment-903817561
Received on Monday, 23 August 2021 14:19:41 UTC