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

Most upvoted comments

Thanks so much, that got it working!

I would expect getting this to work in jest would take some more effort, haven’t got it working yet.