Dexie.js: DataCloneError under fake-IndexedDB
I’m running under node (for unit testing) with fake-indexeddb and dexie-observable I get a 'DataCloneError' (“The data being stored could not be cloned by the internal structured cloning algorithm.”) because in startObserving (Dexie.Observable.js:255 – db._syncNodes.add(mySyncNode.node)) the object being saved has a ‘save’ method and fails isPlainObject in realistic-structured-clone:
// setup tests
Dexie.dependencies.indexedDB = require('fake-indexeddb');
Dexie.dependencies.IDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
console.error src\dexie.ts:96
DexieError {
_e: Error
at getErrorWithStack (C:\crap\node_modules\dexie\dist\dexie.js:322:12)
at new DexieError (C:\crap\node_modules\dexie\dist\dexie.js:451:19)
at Transaction.create (C:\crap\node_modules\dexie\dist\dexie.js:2900:31)
at C:\crap\node_modules\dexie\dist\dexie.js:2228:27
at C:\crap\node_modules\dexie\dist\dexie.js:1349:23
at callListener (C:\crap\node_modules\dexie\dist\dexie.js:1032:19)
at endMicroTickScope (C:\crap\node_modules\dexie\dist\dexie.js:1119:25)
at FDBRequest.onsuccess (C:\crap\node_modules\dexie\dist\dexie.js:1186:17)
at invokeEventListeners (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:59:31)
at FDBRequest.Object.<anonymous>.FakeEventTarget.dispatchEvent (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:112:13)
at FDBTransaction.Object.<anonymous>.FDBTransaction._start (C:\crap\node_modules\fake-indexeddb\build\FDBTransaction.js:207:29)
at Immediate.<anonymous> (C:\crap\node_modules\fake-indexeddb\build\lib\Database.js:25:26)
at runCallback (timers.js:800:20)
at tryOnImmediate (timers.js:762:5)
at processImmediate [as _immediateCallback] (timers.js:733:5),
name: 'OpenFailedError',
message: 'DataCloneError The data being stored could not be cloned by the internal structured cloning algorithm.',
inner:
DexieError {
_e: Error
at getErrorWithStack (C:\crap\node_modules\dexie\dist\dexie.js:322:12)
at new DexieError (C:\crap\node_modules\dexie\dist\dexie.js:451:19)
at mapError (C:\crap\node_modules\dexie\dist\dexie.js:481:14)
at handleRejection (C:\crap\node_modules\dexie\dist\dexie.js:965:14)
at executePromiseTask (C:\crap\node_modules\dexie\dist\dexie.js:957:9)
at new Promise (C:\crap\node_modules\dexie\dist\dexie.js:751:5)
at Transaction._promise (C:\crap\node_modules\dexie\dist\dexie.js:2950:25)
at Table.getTransaction (C:\crap\node_modules\dexie\dist\dexie.js:2347:27)
at Table.getIDBObjectStore (C:\crap\node_modules\dexie\dist\dexie.js:2360:25)
at Table.add (C:\crap\node_modules\dexie\dist\dexie.js:2672:25)
at C:\crap\node_modules\dexie-observable\dist\dexie-observable.js:744:42
at C:\crap\node_modules\dexie\dist\dexie.js:1349:23
at callListener (C:\crap\node_modules\dexie\dist\dexie.js:1032:19)
at endMicroTickScope (C:\crap\node_modules\dexie\dist\dexie.js:1119:25)
at FDBRequest.onsuccess (C:\crap\node_modules\dexie\dist\dexie.js:1186:17)
at invokeEventListeners (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:59:31)
at FDBRequest.Object.<anonymous>.FakeEventTarget.dispatchEvent (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:112:13)
at FDBTransaction.Object.<anonymous>.FDBTransaction._start (C:\crap\node_modules\fake-indexeddb\build\FDBTransaction.js:207:29)
at Immediate.<anonymous> (C:\crap\node_modules\fake-indexeddb\build\lib\Database.js:25:26)
at runCallback (timers.js:800:20)
at tryOnImmediate (timers.js:762:5)
at processImmediate [as _immediateCallback] (timers.js:733:5),
name: 'DataCloneError',
message: 'The data being stored could not be cloned by the internal structured cloning algorithm.',
inner:
{ DataCloneError: The data being stored could not be cloned by the internal structured cloning algorithm.
at new DataCloneError (C:\crap\node_modules\fake-indexeddb\build\lib\errors.js:54:28)
at Object.structuredClone [as default] (C:\crap\node_modules\fake-indexeddb\build\lib\structuredClone.js:10:15)
at buildRecordAddPut (C:\crap\node_modules\fake-indexeddb\build\FDBObjectStore.js:36:42)
at FDBObjectStore.Object.<anonymous>.FDBObjectStore.add (C:\crap\node_modules\fake-indexeddb\build\FDBObjectStore.js:139:22)
at C:\crap\node_modules\dexie\dist\dexie.js:2685:79
at supplyIdbStore (C:\crap\node_modules\dexie\dist\dexie.js:2358:24)
at C:\crap\node_modules\dexie\dist\dexie.js:2951:30
at executePromiseTask (C:\crap\node_modules\dexie\dist\dexie.js:934:9)
at new Promise (C:\crap\node_modules\dexie\dist\dexie.js:751:5)
at Transaction._promise (C:\crap\node_modules\dexie\dist\dexie.js:2950:25)
at Table.getTransaction (C:\crap\node_modules\dexie\dist\dexie.js:2347:27)
at Table.getIDBObjectStore (C:\crap\node_modules\dexie\dist\dexie.js:2360:25)
at Table.add (C:\crap\node_modules\dexie\dist\dexie.js:2672:25)
at C:\crap\node_modules\dexie-observable\dist\dexie-observable.js:744:42
at C:\crap\node_modules\dexie\dist\dexie.js:1349:23
at callListener (C:\crap\node_modules\dexie\dist\dexie.js:1032:19)
at endMicroTickScope (C:\crap\node_modules\dexie\dist\dexie.js:1119:25)
at FDBRequest.onsuccess (C:\crap\node_modules\dexie\dist\dexie.js:1186:17)
at invokeEventListeners (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:59:31)
at FDBRequest.Object.<anonymous>.FakeEventTarget.dispatchEvent (C:\crap\node_modules\fake-indexeddb\build\lib\FakeEventTarget.js:112:13)
at FDBTransaction.Object.<anonymous>.FDBTransaction._start (C:\crap\node_modules\fake-indexeddb\build\FDBTransaction.js:207:29)
at Immediate.<anonymous> (C:\crap\node_modules\fake-indexeddb\build\lib\Database.js:25:26)
at runCallback (timers.js:800:20)
at tryOnImmediate (timers.js:762:5)
at processImmediate [as _immediateCallback] (timers.js:733:5)
name: 'DataCloneError',
message: 'The data being stored could not be cloned by the internal structured cloning algorithm.' } } }
About this issue
- Original URL
- State: open
- Created 6 years ago
- Comments: 33
Thanks so much, that got it working!
I would expect getting this to work in
jestwould take some more effort, haven’t got it working yet.