UNPKG

@tevm/sync-storage-persister

Version:

A package for persisting the state of the EVM to a sync storage

1 lines 5.37 kB
{"version":3,"sources":["../src/throttle.js","../src/createSyncStoragePersister.js","../src/noopPersister.js"],"names":[],"mappings":";;;AAKO,IAAM,QAAW,GAAA,CAAC,IAAM,EAAA,IAAA,GAAO,GAAQ,KAAA;AAI7C,EAAA,IAAI,KAAQ,GAAA,IAAA;AAIZ,EAAI,IAAA,MAAA;AAIJ,EAAM,MAAA,WAAA,GAAc,IAAI,IAAS,KAAA;AAEhC,IAAS,MAAA,GAAA,IAAA;AACT,IAAA,IAAI,UAAU,IAAM,EAAA;AAEnB,MAAA,KAAA,GAAQ,WAAW,MAAM;AACxB,QAAM,MAAA,CAAA;AAAA;AAAA,UAAuB;AAAA,SAAA;AAC7B,QAAM,MAAA,GAAA,GAAM,CAAE,CAAA,GAAG,MAAM,CAAA;AACvB,QAAQ,KAAA,GAAA,IAAA;AACR,QAAO,OAAA,GAAA;AAAA,SACL,IAAI,CAAA;AAAA;AACR,GACD;AACA,EAAA;AAAA;AAAA,IAAwB;AAAA;AACzB,CAAA;;;ACxBO,IAAM,6BAA6B,CAAC;AAAA,EAC1C,OAAA;AAAA,EACA,GAAM,GAAA,2BAAA;AAAA,EACN,YAAe,GAAA,GAAA;AAAA,EACf,YAAY,IAAK,CAAA,SAAA;AAAA,EACjB,cAAc,IAAK,CAAA;AACpB,CAAM,KAAA;AAKL,EAAM,MAAA,OAAA,GAAU,CAAC,KAAU,KAAA;AAC1B,IAAI,IAAA;AACH,MAAM,MAAA,eAAA,GAAkB,UAAU,KAAK,CAAA;AACvC,MAAQ,OAAA,CAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AACpC,MAAA,IAAI,OAAQ,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,eAAiB,EAAA;AAC7C,QAAA,MAAM,IAAI,KAAA;AAAA,UACT;AAAA,SACD;AAAA;AAED,MAAO,OAAA,KAAA,CAAA;AAAA,aACC,KAAO,EAAA;AACf,MAAA;AAAA;AAAA,QAA4B;AAAA;AAAA;AAC7B,GACD;AACA,EAAO,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,gBAAkB,EAAA,QAAA,CAAS,CAAC,cAAA,EAAgB,OAAY,KAAA;AACvD,MAAA,IAAI,CAAC,cAAgB,EAAA;AACpB,QAAA;AAAA;AAGD,MAAA,MAAM,OAAU,GAAA,CAAA;AAChB,MAAI,IAAA,KAAA,GAAQ,QAAQ,cAAc,CAAA;AAClC,MAAA,IAAI,UAAa,GAAA,CAAA;AACjB,MAAO,OAAA,KAAA,IAAS,aAAa,OAAS,EAAA;AACrC,QAAA,UAAA,EAAA;AACA,QAAA,KAAA,GAAQ,QAAQ,cAAc,CAAA;AAAA;AAE/B,MAAA,IAAI,WAAW,KAAO,EAAA;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AAEd,MAAO,OAAA,KAAA;AAAA,OACL,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,IAIf,cAAc,MAAM;AACnB,MAAM,MAAA,WAAA,GAAc,OAAQ,CAAA,OAAA,CAAQ,GAAG,CAAA;AACvC,MAAA,IAAI,CAAC,WAAa,EAAA;AACjB,QAAA;AAAA;AAED,MAAA,OAAO,YAAY,WAAW,CAAA;AAAA,KAC/B;AAAA;AAAA;AAAA;AAAA,IAIA,sBAAsB,MAAM;AAC3B,MAAI,IAAA;AACH,QAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AACtB,QAAO,OAAA,KAAA,CAAA;AAAA,eACC,CAAG,EAAA;AACX,QAAA;AAAA;AAAA,UAA6B;AAAA;AAAA;AAC9B;AACD,GACD;AACD;;;ACzEO,IAAM,aAAgB,GAAA;AAAA,EAC5B,kBAAkB,MAAM,MAAA;AAAA,EACxB,cAAc,MAAM,MAAA;AAAA,EACpB,sBAAsB,MAAM;AAC7B","file":"index.cjs","sourcesContent":["/**\n * @internal\n * A simple throttle function\n * @type {import('./ThrottleFn.ts').ThrottleFn}\n */\nexport const throttle = (func, wait = 100) => {\n\t/**\n\t * @type {ReturnType<typeof setTimeout> | null}\n\t */\n\tlet timer = null\n\t/**\n\t * @type {Array<any>}\n\t */\n\tlet params\n\t/**\n\t * @param {...any[]} args\n\t */\n\tconst throttledFn = (...args) => {\n\t\t// set the latest args\n\t\tparams = args\n\t\tif (timer === null) {\n\t\t\t// wait til wait time after first call to run the function\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tconst f = /** @type {any}*/ (func)\n\t\t\t\tconst res = f(...params)\n\t\t\t\ttimer = null\n\t\t\t\treturn res\n\t\t\t}, wait)\n\t\t}\n\t}\n\treturn /** @type any*/ (throttledFn)\n}\n","import { throttle } from './throttle.js'\n\n/**\n * Creates a syncronous storage persister to be used in tevm clients\n * @param {import('./CreateSyncStoragePersisterOptions.js').CreateSyncStoragePersisterOptions} options\n * @returns {import('./SyncStoragePersister.js').SyncStoragePersister}\n */\nexport const createSyncStoragePersister = ({\n\tstorage,\n\tkey = 'REACT_QUERY_OFFLINE_CACHE',\n\tthrottleTime = 1000,\n\tserialize = JSON.stringify,\n\tdeserialize = JSON.parse,\n}) => {\n\t/**\n\t * @param {import('@tevm/state').SerializableTevmState} state\n\t * @returns {Error | undefined}\n\t */\n\tconst trySave = (state) => {\n\t\ttry {\n\t\t\tconst serializedState = serialize(state)\n\t\t\tstorage.setItem(key, serializedState)\n\t\t\tif (storage.getItem(key) !== serializedState) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Detected a failure to save state. There appears to be a problem with the provided state persister',\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn undefined\n\t\t} catch (error) {\n\t\t\treturn /** @type {Error}*/ (error)\n\t\t}\n\t}\n\treturn {\n\t\t/**\n\t\t * @param {import('@tevm/state').SerializableTevmState | undefined} persistedState\n\t\t * @param {(error: Error | undefined) => void} [onError]\n\t\t * @returns {Error | undefined}\n\t\t */\n\t\tpersistTevmState: throttle((persistedState, onError) => {\n\t\t\tif (!persistedState) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// TODO make this configurable\n\t\t\tconst retries = 3\n\t\t\tlet error = trySave(persistedState)\n\t\t\tlet errorCount = 0\n\t\t\twhile (error && errorCount < retries) {\n\t\t\t\terrorCount++\n\t\t\t\terror = trySave(persistedState)\n\t\t\t}\n\t\t\tif (onError && error) {\n\t\t\t\tonError(error)\n\t\t\t}\n\t\t\treturn error\n\t\t}, throttleTime),\n\t\t/**\n\t\t * @returns {import('@tevm/state').SerializableTevmState | undefined}\n\t\t */\n\t\trestoreState: () => {\n\t\t\tconst cacheString = storage.getItem(key)\n\t\t\tif (!cacheString) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\treturn deserialize(cacheString)\n\t\t},\n\t\t/**\n\t\t * @returns {Error | undefined}\n\t\t */\n\t\tremovePersistedState: () => {\n\t\t\ttry {\n\t\t\t\tstorage.removeItem(key)\n\t\t\t\treturn undefined\n\t\t\t} catch (e) {\n\t\t\t\treturn /** @type {Error} */ (e)\n\t\t\t}\n\t\t},\n\t}\n}\n","/**\n * A persister that does nothing, useful as a default\n * @type {import('./SyncStoragePersister.js').SyncStoragePersister}\n */\nexport const noopPersister = {\n\tpersistTevmState: () => undefined,\n\trestoreState: () => undefined,\n\tremovePersistedState: () => undefined,\n}\n"]}