diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6ad8bea4..3b91bac0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,6 @@ +default: + interruptible: true + variables: GIT_SUBMODULE_STRATEGY: recursive diff --git a/benches/DB1KiB.ts b/benches/DB1KiB.ts index 8afb4cbc..98f916b4 100644 --- a/benches/DB1KiB.ts +++ b/benches/DB1KiB.ts @@ -11,11 +11,10 @@ const logger = new Logger('DB1KiB Bench', LogLevel.WARN, [new StreamHandler()]); async function main() { const dataDir = await fs.promises.mkdtemp( - path.join(os.tmpdir(), 'encryptedfs-benches-'), + path.join(os.tmpdir(), 'db-benches-'), ); const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, logger }); - await db.start(); const data0 = crypto.randomBytes(0); const data1KiB = crypto.randomBytes(1024); const summary = await b.suite( diff --git a/benches/DB1MiB.ts b/benches/DB1MiB.ts index 8fba9c4f..580d5979 100644 --- a/benches/DB1MiB.ts +++ b/benches/DB1MiB.ts @@ -11,11 +11,10 @@ const logger = new Logger('DB1MiB Bench', LogLevel.WARN, [new StreamHandler()]); async function main() { const dataDir = await fs.promises.mkdtemp( - path.join(os.tmpdir(), 'encryptedfs-benches-'), + path.join(os.tmpdir(), 'db-benches-'), ); const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, logger }); - await db.start(); const data0 = crypto.randomBytes(0); const data1MiB = crypto.randomBytes(1024 * 1024); const summary = await b.suite( diff --git a/benches/DBLevel.ts b/benches/DBLevel.ts new file mode 100644 index 00000000..2d2ac000 --- /dev/null +++ b/benches/DBLevel.ts @@ -0,0 +1,86 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs'; +import b from 'benny'; +import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; +import DB from '@/DB'; +import packageJson from '../package.json'; + +const logger = new Logger('DBLevel Bench', LogLevel.WARN, [ + new StreamHandler(), +]); + +async function main() { + const dataDir = await fs.promises.mkdtemp( + path.join(os.tmpdir(), 'encryptedfs-benches-'), + ); + const dbPath = `${dataDir}/db`; + const db = await DB.createDB({ dbPath, logger }); + const summary = await b.suite( + 'DBLevel', + b.add('create 1 sublevels', async () => { + let level; + for (let i = 0; i < 1; i++) { + level = await db.level(`level${i}`, level); + } + }), + b.add('create 2 sublevels', async () => { + let level; + for (let i = 0; i < 2; i++) { + level = await db.level(`level${i}`, level); + } + }), + b.add('create 3 sublevels', async () => { + let level; + for (let i = 0; i < 3; i++) { + level = await db.level(`level${i}`, level); + } + }), + b.add('create 4 sublevels', async () => { + let level; + for (let i = 0; i < 4; i++) { + level = await db.level(`level${i}`, level); + } + }), + b.add('get via sublevel', async () => { + await db.put(['level0'], 'hello', 'world'); + return async () => { + const level = await db.level('level0'); + await level.get('hello'); + }; + }), + b.add('get via key path concatenation', async () => { + await db.put(['level0'], 'hello', 'world'); + return async () => { + await db.get(['level0'], 'hello'); + }; + }), + b.cycle(), + b.complete(), + b.save({ + file: 'DBLevel', + folder: 'benches/results', + version: packageJson.version, + details: true, + }), + b.save({ + file: 'DBLevel', + folder: 'benches/results', + format: 'chart.html', + }), + ); + await db.stop(); + await fs.promises.rm(dataDir, { + force: true, + recursive: true, + }); + return summary; +} + +if (require.main === module) { + (async () => { + await main(); + })(); +} + +export default main; diff --git a/benches/index.ts b/benches/index.ts index 1232e30a..81765cc8 100644 --- a/benches/index.ts +++ b/benches/index.ts @@ -4,10 +4,12 @@ import fs from 'fs'; import si from 'systeminformation'; import DB1KiBBench from './DB1KiB'; import DB1MiBBench from './DB1MiB'; +import DBLevelBench from './DBLevel'; async function main(): Promise { await DB1KiBBench(); await DB1MiBBench(); + await DBLevelBench(); const systemData = await si.get({ cpu: '*', osInfo: 'platform, distro, release, kernel, arch', diff --git a/benches/results/DB1KiB.chart.html b/benches/results/DB1KiB.chart.html index 215b09f2..f8e684c0 100644 --- a/benches/results/DB1KiB.chart.html +++ b/benches/results/DB1KiB.chart.html @@ -16,7 +16,7 @@
- +
+ + DBLevel + + +
+ +
+ + + diff --git a/benches/results/DBLevel.json b/benches/results/DBLevel.json new file mode 100644 index 00000000..2fe993e0 --- /dev/null +++ b/benches/results/DBLevel.json @@ -0,0 +1,671 @@ +{ + "name": "DBLevel", + "date": "2022-03-23T04:38:52.784Z", + "version": "1.2.1", + "results": [ + { + "name": "create 1 sublevels", + "ops": 82387, + "margin": 6.03, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 81, + "promise": true, + "details": { + "min": 0.00001064311372299873, + "max": 0.000041776577338129494, + "mean": 0.000012137807129761317, + "median": 0.000011637322719060524, + "standardDeviation": 0.0000033606785478215373, + "marginOfError": 7.318811059700236e-7, + "relativeMarginOfError": 6.029763845690763, + "standardErrorOfMean": 3.7340872753572636e-7, + "sampleVariance": 1.1294160301787878e-11, + "sampleResults": [ + 0.00001064311372299873, + 0.000011297824034334765, + 0.000011327521346284166, + 0.00001133068759882539, + 0.00001133104721030043, + 0.00001133713485430314, + 0.000011338196521346285, + 0.000011340846622995256, + 0.000011361735486785633, + 0.000011367038026256226, + 0.000011379261576688502, + 0.000011380958672086722, + 0.000011387994804608086, + 0.00001139909280217293, + 0.000011399285616594483, + 0.000011409334314169307, + 0.00001141888055618874, + 0.000011424020103907838, + 0.000011437908103214124, + 0.000011453198554325729, + 0.000011463787686736078, + 0.00001146379674060661, + 0.00001146803983703033, + 0.000011468169081032142, + 0.000011490248701152022, + 0.00001149678134902671, + 0.000011502734583239214, + 0.000011503194658216388, + 0.000011506267223853625, + 0.00001152973675871435, + 0.000011530749943528349, + 0.000011536361562782294, + 0.000011542708380393043, + 0.00001154328303591597, + 0.0000115484908515925, + 0.000011553532799999999, + 0.000011576920914285714, + 0.000011584038252602987, + 0.000011593319403659363, + 0.000011631383085714286, + 0.000011637322719060524, + 0.000011668279647616896, + 0.000011671581432121076, + 0.000011687143378162753, + 0.000011698000683838613, + 0.000011719933589338152, + 0.000011765751298847978, + 0.000011800936228571428, + 0.000011806318048339733, + 0.00001180841834199232, + 0.000011811326632030721, + 0.000011835336345154732, + 0.000011840249886826619, + 0.000011851418057142856, + 0.000011883857533622065, + 0.000011899701485714286, + 0.000011947828552066862, + 0.000011958202846171222, + 0.000011979641969731196, + 0.000012013162057142857, + 0.000012022295085714286, + 0.000012126464685714285, + 0.00001220778299521313, + 0.000012226834055162981, + 0.000012242855026213814, + 0.000012261869842717118, + 0.000012265105994985182, + 0.00001231652769546387, + 0.000012334332571428571, + 0.0000123822224, + 0.000012422931616138592, + 0.000012425284342857142, + 0.000012427250284932756, + 0.000012535637485714286, + 0.000012538495314285714, + 0.00001256163984499658, + 0.000012582970594939594, + 0.000012595832687485753, + 0.000012622171222046533, + 0.000012704260314565762, + 0.000041776577338129494 + ] + }, + "completed": true, + "percentSlower": 0 + }, + { + "name": "create 2 sublevels", + "ops": 45316, + "margin": 0.69, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 84, + "promise": true, + "details": { + "min": 0.00002136060756802721, + "max": 0.000025227300255536628, + "mean": 0.000022067232485667413, + "median": 0.000021775282417811604, + "standardDeviation": 7.088609628025949e-7, + "marginOfError": 1.515924208979678e-7, + "relativeMarginOfError": 0.6869571025565917, + "standardErrorOfMean": 7.734307188671827e-8, + "sampleVariance": 5.024838645854219e-13, + "sampleResults": [ + 0.00002136060756802721, + 0.000021383335744680852, + 0.000021386934042553194, + 0.000021406294042553193, + 0.000021415055792163543, + 0.000021451814468085106, + 0.00002146061404255319, + 0.00002146637478705281, + 0.000021485628194207836, + 0.00002152941229578676, + 0.000021538770638297872, + 0.000021539457908163266, + 0.00002155480144557823, + 0.000021556729148753225, + 0.000021560475724020442, + 0.000021567255536626915, + 0.00002156929234042553, + 0.000021578731728288908, + 0.000021590899914821124, + 0.00002160020170212766, + 0.0000216460625, + 0.000021654342553191487, + 0.000021671277021276594, + 0.000021675776870163372, + 0.000021678332179930794, + 0.000021679300515907135, + 0.000021700766183986372, + 0.000021701235319148934, + 0.000021703674307958478, + 0.000021707218858131485, + 0.000021707596020761246, + 0.000021745113069647462, + 0.00002175181659574468, + 0.000021752265570934257, + 0.00002175611375432526, + 0.00002175622188581315, + 0.000021759930212765956, + 0.000021764265531914894, + 0.000021765382978723403, + 0.000021766098639455783, + 0.0000217724514893617, + 0.000021774140154772142, + 0.000021776424680851066, + 0.000021825440311418686, + 0.000021838595826235094, + 0.000021851576235093697, + 0.000021855140584694758, + 0.000021874831345826233, + 0.00002189113370593293, + 0.000021894574806534822, + 0.0000218979865916955, + 0.000021916004255319148, + 0.000021925863714531385, + 0.00002194397402044293, + 0.000021962612024221454, + 0.000022005270017035776, + 0.000022142241908006816, + 0.00002220054541522491, + 0.00002221483688245315, + 0.000022251725298126067, + 0.000022254434412265756, + 0.0000223478125, + 0.00002241268400687876, + 0.000022466030954428204, + 0.000022478845826235096, + 0.000022545909602076123, + 0.000022547551903114186, + 0.00002258607223183391, + 0.00002259548495270851, + 0.000022637255110732537, + 0.00002264890787197232, + 0.00002267336347975883, + 0.000022697320934256055, + 0.000022704968483816013, + 0.000022746815744680852, + 0.000022781240221088438, + 0.000022805427172061327, + 0.000022822220588235293, + 0.000022878916241496597, + 0.000023085505930656934, + 0.000023251907155025555, + 0.000024459412629757786, + 0.000024831293685121107, + 0.000025227300255536628 + ] + }, + "completed": true, + "percentSlower": 45 + }, + { + "name": "create 3 sublevels", + "ops": 30535, + "margin": 0.67, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 85, + "promise": true, + "details": { + "min": 0.00003171388291139241, + "max": 0.00003909498101265823, + "mean": 0.00003274920259908526, + "median": 0.000032417335443037975, + "standardDeviation": 0.0000010300121882527498, + "marginOfError": 2.1897219524533558e-7, + "relativeMarginOfError": 0.6686336700346158, + "standardErrorOfMean": 1.1172050777823244e-7, + "sampleVariance": 1.060925107949218e-12, + "sampleResults": [ + 0.00003171388291139241, + 0.00003191080632911392, + 0.00003198596708860759, + 0.00003199878813018507, + 0.00003201280280791321, + 0.000032019248245054246, + 0.00003203423420548819, + 0.0000320383458838545, + 0.00003204082705807275, + 0.000032080833120204604, + 0.0000320945979578813, + 0.00003209798145780051, + 0.00003209921392405063, + 0.00003211411167836631, + 0.00003211994958519464, + 0.00003212787683471602, + 0.00003217173133375878, + 0.00003217623931078494, + 0.000032178731012658225, + 0.00003217914231014678, + 0.000032201023017902816, + 0.00003220898213146139, + 0.00003221865539246969, + 0.0000322306082278481, + 0.00003223901978302489, + 0.00003224361646458201, + 0.000032249849104859336, + 0.00003225239566049777, + 0.00003229632658227848, + 0.00003230458710912572, + 0.000032313409207161124, + 0.00003231440842373963, + 0.000032350474154435225, + 0.00003235365985960434, + 0.00003235492064516129, + 0.00003236107594128909, + 0.000032368622784810124, + 0.000032368856413529034, + 0.0000323726170886076, + 0.00003238837715379707, + 0.0000324042144224633, + 0.000032410389917038927, + 0.000032417335443037975, + 0.000032418037013401404, + 0.0000324412342054882, + 0.00003247523607594937, + 0.000032478844303797466, + 0.000032480574683544303, + 0.00003249508806636886, + 0.000032502962276214835, + 0.000032523125717932355, + 0.00003257021378430121, + 0.00003257218379068283, + 0.000032613567088607593, + 0.000032662898532227186, + 0.00003269432291001914, + 0.000032727996738421394, + 0.00003277309079283888, + 0.000032783603870967744, + 0.0000327918410976388, + 0.00003281539502233567, + 0.000032828802169751114, + 0.000032837316496163686, + 0.00003286176854219949, + 0.00003287299168797954, + 0.000032895220886075946, + 0.00003293841033822591, + 0.00003305218924050633, + 0.00003318915315890236, + 0.000033297321633694955, + 0.00003330847989789407, + 0.00003340336247606892, + 0.00003343491448627952, + 0.00003348907341772152, + 0.00003353116177429876, + 0.000033590142583120205, + 0.00003371865379746835, + 0.000033770510230179034, + 0.00003385200126582278, + 0.00003407077658227848, + 0.00003413538098276962, + 0.0000343212253164557, + 0.00003582968602425016, + 0.000036119744836775486, + 0.00003909498101265823 + ] + }, + "completed": true, + "percentSlower": 62.94 + }, + { + "name": "create 4 sublevels", + "ops": 22787, + "margin": 1.1, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 86, + "promise": true, + "details": { + "min": 0.00004243448813559322, + "max": 0.00005842204230118443, + "mean": 0.00004388532278658509, + "median": 0.00004330981015515214, + "standardDeviation": 0.0000022878028724785556, + "marginOfError": 4.835322514330239e-7, + "relativeMarginOfError": 1.1018085791107146, + "standardErrorOfMean": 2.4670012828215503e-7, + "sampleVariance": 5.2340419833211305e-12, + "sampleResults": [ + 0.00004243448813559322, + 0.00004244343522438611, + 0.00004245705762711864, + 0.00004247551905165114, + 0.0000424853214890017, + 0.00004257962013536379, + 0.000042618236886632825, + 0.00004262853389830508, + 0.0000426622461928934, + 0.00004270883050847457, + 0.00004271761779661017, + 0.0000427192906779661, + 0.00004272374111675127, + 0.00004274082148900169, + 0.000042745991539763115, + 0.000042751789340101526, + 0.00004276463959390863, + 0.0000427679593220339, + 0.0000427922385786802, + 0.0000428011641285956, + 0.0000428140744500846, + 0.00004284668189509307, + 0.000042856039763113366, + 0.00004287131610169491, + 0.00004288678257191201, + 0.00004290607627118644, + 0.000042929036379018614, + 0.00004293607372881356, + 0.000042952881556683587, + 0.00004297291525423729, + 0.00004299025254237288, + 0.00004299840862944163, + 0.00004304835025380711, + 0.0000430540686440678, + 0.00004305700677966102, + 0.000043073236886632826, + 0.00004309023181049069, + 0.00004316652711864407, + 0.00004316748094834886, + 0.00004317549406779661, + 0.000043189801184433164, + 0.00004323996531302876, + 0.00004328351692047377, + 0.00004333610338983051, + 0.000043375399323181046, + 0.00004338186717428088, + 0.0000433882910321489, + 0.000043430240270727585, + 0.00004345538050847458, + 0.00004346631525423729, + 0.00004350278934010152, + 0.00004351661505922166, + 0.00004356725042301184, + 0.000043591035532994925, + 0.00004361004822335025, + 0.00004363178172588832, + 0.00004371317935702199, + 0.000043774115059221656, + 0.000043878568527918776, + 0.0000439072614213198, + 0.00004395473519458545, + 0.00004395737225042301, + 0.000044045128595600676, + 0.000044143758037225046, + 0.000044199818950930624, + 0.00004423467428087986, + 0.000044295703891708967, + 0.00004432926355932203, + 0.000044528022842639595, + 0.00004455440016920474, + 0.00004457627664974619, + 0.00004460246023688664, + 0.000044616327411167515, + 0.000044672338409475466, + 0.000044757864636209817, + 0.000045009609983079525, + 0.00004516711844331641, + 0.00004529169081272085, + 0.00004532903045685279, + 0.00004546394923857868, + 0.00004598992790500424, + 0.000046027444162436545, + 0.000046066441624365484, + 0.00004686694247038917, + 0.00005598441370558375, + 0.00005842204230118443 + ] + }, + "completed": true, + "percentSlower": 72.34 + }, + { + "name": "get via sublevel", + "ops": 25779, + "margin": 3.32, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 70, + "promise": true, + "details": { + "min": 0.00003300552838709677, + "max": 0.00006082869881656805, + "mean": 0.00003879101649048303, + "median": 0.00003714802633136095, + "standardDeviation": 0.000005504770002879293, + "marginOfError": 0.0000012895738846684323, + "relativeMarginOfError": 3.3244137466333616, + "standardErrorOfMean": 6.579458595247103e-7, + "sampleVariance": 3.0302492784599686e-11, + "sampleResults": [ + 0.00003300552838709677, + 0.00003306345739644971, + 0.000033088705657978386, + 0.0000331666775147929, + 0.0000332454201145767, + 0.000033416195857988166, + 0.0000334953774665818, + 0.0000339746976331361, + 0.000034253379881656804, + 0.00003428085798816568, + 0.00003436600769230769, + 0.00003441587100591716, + 0.000034623993548387094, + 0.00003480895266272189, + 0.000034923631612903226, + 0.00003504090650887574, + 0.000035133862721893494, + 0.000035134505928853756, + 0.00003528501782304265, + 0.00003568111834319527, + 0.00003572912721893491, + 0.000035811252662721894, + 0.00003587390515595162, + 0.000036051968047337275, + 0.00003631742426035503, + 0.00003639714319526628, + 0.00003640170273711012, + 0.00003642740710059172, + 0.00003648883952347582, + 0.00003656489822485207, + 0.00003671371225806452, + 0.000036778592899408286, + 0.00003678442130177515, + 0.000036914219605346914, + 0.000037080045562130184, + 0.00003721600710059172, + 0.000037272643307638406, + 0.00003769090609670637, + 0.00003771029171597633, + 0.00003773159881656805, + 0.00003786027573964497, + 0.00003792635327816677, + 0.00003817900236686391, + 0.000038494997633136096, + 0.00003853044852071006, + 0.0000386156100591716, + 0.00003877670357393132, + 0.0000388135899408284, + 0.00003898943550295858, + 0.000039166890532544385, + 0.00003918962721893491, + 0.00003944695443786982, + 0.000039594433727810646, + 0.000039705004733727814, + 0.000040162662635264163, + 0.000041142165088757396, + 0.000041542453846153844, + 0.00004196745976331361, + 0.000043165184023668636, + 0.00004445256272189349, + 0.00004472883573243014, + 0.00004572720406435224, + 0.000046773333951762525, + 0.00004798054638218923, + 0.00004926698979591836, + 0.00004939325088757397, + 0.00005087957747671465, + 0.00005176118629343629, + 0.00005394944305019305, + 0.00006082869881656805 + ] + }, + "completed": true, + "percentSlower": 68.71 + }, + { + "name": "get via key path concatenation", + "ops": 55297, + "margin": 2.39, + "options": { + "delay": 0.005, + "initCount": 1, + "minTime": 0.05, + "maxTime": 5, + "minSamples": 5 + }, + "samples": 76, + "promise": true, + "details": { + "min": 0.000015546719589495924, + "max": 0.000025667216581276202, + "mean": 0.000018084231208409096, + "median": 0.000017483098400241475, + "standardDeviation": 0.000001918719817613655, + "marginOfError": 4.313808247488305e-7, + "relativeMarginOfError": 2.385397641610776, + "standardErrorOfMean": 2.2009225752491353e-7, + "sampleVariance": 3.681485738503378e-12, + "sampleResults": [ + 0.000015546719589495924, + 0.000015689552671294897, + 0.000015728515846664655, + 0.00001588731934802294, + 0.000016018427709025052, + 0.00001605782644129188, + 0.000016061394808330818, + 0.000016078115001509205, + 0.000016243464856230034, + 0.000016288800784787202, + 0.00001673225747057048, + 0.00001679643194888179, + 0.000016801713738019168, + 0.000016804146325878596, + 0.000016929188498402556, + 0.00001695792668918919, + 0.000016961852364864866, + 0.00001697718658146965, + 0.000016996270607028753, + 0.00001701066888016903, + 0.000017015885942492012, + 0.00001708215135135135, + 0.000017130035143769968, + 0.000017176475337837836, + 0.00001720185782747604, + 0.000017211051118210862, + 0.00001723911054313099, + 0.000017253350675675675, + 0.00001729205782747604, + 0.00001730876325878594, + 0.000017334076677316295, + 0.000017343723211590705, + 0.00001736751980830671, + 0.0000173941277027027, + 0.000017399542172523962, + 0.000017406184025559106, + 0.000017437076357827473, + 0.000017475956836703895, + 0.000017490239963779052, + 0.000017507849520766772, + 0.000017537112460063897, + 0.000017547671621621622, + 0.000017633066216216218, + 0.0000176617607028754, + 0.000017662759424920127, + 0.00001766367401146997, + 0.000017665397124600637, + 0.000017808100675675675, + 0.000017865112761647536, + 0.00001786714984025559, + 0.000017909424600638978, + 0.00001791417939189189, + 0.000018062308306709265, + 0.00001817925354663447, + 0.00001830796517571885, + 0.000018388825, + 0.000018535690878378376, + 0.000018744485303514377, + 0.00001875297412140575, + 0.00001883442076667673, + 0.000019027233926954422, + 0.000019228414729852097, + 0.000019290908542106853, + 0.00001953649290673106, + 0.000019816597947479628, + 0.000020340611228493815, + 0.000020823370926517573, + 0.000021196669009584667, + 0.000021547783881678235, + 0.000021598722607908242, + 0.000021695265016601266, + 0.000021877224870017332, + 0.000022120306325823223, + 0.00002227612088388215, + 0.00002318248505885904, + 0.000025667216581276202 + ] + }, + "completed": true, + "percentSlower": 32.88 + } + ], + "fastest": { + "name": "create 1 sublevels", + "index": 0 + }, + "slowest": { + "name": "create 4 sublevels", + "index": 3 + } +} \ No newline at end of file diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js index 9972a465..abfa17b2 100644 --- a/docs/assets/js/search.js +++ b/docs/assets/js/search.js @@ -1 +1 @@ -window.searchData = {"kinds":{"1":"Module","32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias","16777216":"Reference"},"rows":[{"id":0,"kind":1,"name":"DB","url":"modules/DB.html","classes":"tsd-kind-module"},{"id":1,"kind":128,"name":"default","url":"classes/DB.default.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"DB"},{"id":2,"kind":2048,"name":"createDB","url":"classes/DB.default.html#createDB","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"DB.default"},{"id":3,"kind":512,"name":"constructor","url":"classes/DB.default.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":4,"kind":1024,"name":"dbPath","url":"classes/DB.default.html#dbPath","classes":"tsd-kind-property tsd-parent-kind-class","parent":"DB.default"},{"id":5,"kind":1024,"name":"crypto","url":"classes/DB.default.html#crypto","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":6,"kind":65536,"name":"__type","url":"classes/DB.default.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"DB.default"},{"id":7,"kind":1024,"name":"key","url":"classes/DB.default.html#__type.key","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"DB.default.__type"},{"id":8,"kind":1024,"name":"ops","url":"classes/DB.default.html#__type.ops","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"DB.default.__type"},{"id":9,"kind":1024,"name":"lock","url":"classes/DB.default.html#lock","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":10,"kind":1024,"name":"fs","url":"classes/DB.default.html#fs","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":11,"kind":1024,"name":"logger","url":"classes/DB.default.html#logger","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":12,"kind":1024,"name":"workerManager","url":"classes/DB.default.html#workerManager","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":13,"kind":1024,"name":"_db","url":"classes/DB.default.html#_db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":14,"kind":262144,"name":"db","url":"classes/DB.default.html#db","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DB.default"},{"id":15,"kind":262144,"name":"locked","url":"classes/DB.default.html#locked","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DB.default"},{"id":16,"kind":2048,"name":"start","url":"classes/DB.default.html#start","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":17,"kind":2048,"name":"stop","url":"classes/DB.default.html#stop","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":18,"kind":2048,"name":"destroy","url":"classes/DB.default.html#destroy","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":19,"kind":2048,"name":"setWorkerManager","url":"classes/DB.default.html#setWorkerManager","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":20,"kind":2048,"name":"unsetWorkerManager","url":"classes/DB.default.html#unsetWorkerManager","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":21,"kind":2048,"name":"withLocks","url":"classes/DB.default.html#withLocks","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":22,"kind":2048,"name":"transact","url":"classes/DB.default.html#transact","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":23,"kind":2048,"name":"level","url":"classes/DB.default.html#level","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":24,"kind":2048,"name":"count","url":"classes/DB.default.html#count","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":25,"kind":2048,"name":"get","url":"classes/DB.default.html#get","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":26,"kind":2048,"name":"put","url":"classes/DB.default.html#put","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":27,"kind":2048,"name":"del","url":"classes/DB.default.html#del","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":28,"kind":2048,"name":"batch","url":"classes/DB.default.html#batch","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":29,"kind":2048,"name":"serializeEncrypt","url":"classes/DB.default.html#serializeEncrypt","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":30,"kind":2048,"name":"deserializeDecrypt","url":"classes/DB.default.html#deserializeDecrypt","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":31,"kind":1,"name":"Transaction","url":"modules/Transaction.html","classes":"tsd-kind-module"},{"id":32,"kind":128,"name":"default","url":"classes/Transaction.default.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"Transaction"},{"id":33,"kind":512,"name":"constructor","url":"classes/Transaction.default.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Transaction.default"},{"id":34,"kind":1024,"name":"db","url":"classes/Transaction.default.html#db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":35,"kind":1024,"name":"logger","url":"classes/Transaction.default.html#logger","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":36,"kind":1024,"name":"_ops","url":"classes/Transaction.default.html#_ops","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":37,"kind":1024,"name":"_snap","url":"classes/Transaction.default.html#_snap","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":38,"kind":1024,"name":"_callbacksSuccess","url":"classes/Transaction.default.html#_callbacksSuccess","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":39,"kind":1024,"name":"_callbacksFailure","url":"classes/Transaction.default.html#_callbacksFailure","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":40,"kind":1024,"name":"_committed","url":"classes/Transaction.default.html#_committed","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":41,"kind":1024,"name":"_rollbacked","url":"classes/Transaction.default.html#_rollbacked","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"Transaction.default"},{"id":42,"kind":262144,"name":"ops","url":"classes/Transaction.default.html#ops","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":43,"kind":262144,"name":"snap","url":"classes/Transaction.default.html#snap","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":44,"kind":262144,"name":"callbacksSuccess","url":"classes/Transaction.default.html#callbacksSuccess","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":45,"kind":262144,"name":"callbacksFailure","url":"classes/Transaction.default.html#callbacksFailure","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":46,"kind":262144,"name":"committed","url":"classes/Transaction.default.html#committed","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":47,"kind":262144,"name":"rollbacked","url":"classes/Transaction.default.html#rollbacked","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"Transaction.default"},{"id":48,"kind":2048,"name":"get","url":"classes/Transaction.default.html#get","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Transaction.default"},{"id":49,"kind":2048,"name":"put","url":"classes/Transaction.default.html#put","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":50,"kind":2048,"name":"del","url":"classes/Transaction.default.html#del","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":51,"kind":2048,"name":"queueSuccess","url":"classes/Transaction.default.html#queueSuccess","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":52,"kind":2048,"name":"queueFailure","url":"classes/Transaction.default.html#queueFailure","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":53,"kind":2048,"name":"commit","url":"classes/Transaction.default.html#commit","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":54,"kind":2048,"name":"rollback","url":"classes/Transaction.default.html#rollback","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":55,"kind":2048,"name":"finalize","url":"classes/Transaction.default.html#finalize","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Transaction.default"},{"id":56,"kind":1,"name":"errors","url":"modules/errors.html","classes":"tsd-kind-module"},{"id":57,"kind":128,"name":"ErrorDB","url":"classes/errors.ErrorDB.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":58,"kind":65536,"name":"__type","url":"classes/errors.ErrorDB.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":59,"kind":512,"name":"constructor","url":"classes/errors.ErrorDB.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"errors.ErrorDB"},{"id":60,"kind":1024,"name":"data","url":"classes/errors.ErrorDB.html#data","classes":"tsd-kind-property tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":61,"kind":1024,"name":"cause","url":"classes/errors.ErrorDB.html#cause","classes":"tsd-kind-property tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":62,"kind":128,"name":"ErrorDBRunning","url":"classes/errors.ErrorDBRunning.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":63,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBRunning.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBRunning"},{"id":64,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBRunning.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":65,"kind":1024,"name":"data","url":"classes/errors.ErrorDBRunning.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":66,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBRunning.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":67,"kind":128,"name":"ErrorDBNotRunning","url":"classes/errors.ErrorDBNotRunning.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":68,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBNotRunning.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBNotRunning"},{"id":69,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBNotRunning.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":70,"kind":1024,"name":"data","url":"classes/errors.ErrorDBNotRunning.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":71,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBNotRunning.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":72,"kind":128,"name":"ErrorDBDestroyed","url":"classes/errors.ErrorDBDestroyed.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":73,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDestroyed.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDestroyed"},{"id":74,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDestroyed.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":75,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDestroyed.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":76,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDestroyed.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":77,"kind":128,"name":"ErrorDBCreate","url":"classes/errors.ErrorDBCreate.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":78,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBCreate.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBCreate"},{"id":79,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBCreate.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":80,"kind":1024,"name":"data","url":"classes/errors.ErrorDBCreate.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":81,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBCreate.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":82,"kind":128,"name":"ErrorDBDelete","url":"classes/errors.ErrorDBDelete.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":83,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDelete.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDelete"},{"id":84,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDelete.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":85,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDelete.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":86,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDelete.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":87,"kind":128,"name":"ErrorDBLevelPrefix","url":"classes/errors.ErrorDBLevelPrefix.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":88,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBLevelPrefix.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBLevelPrefix"},{"id":89,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBLevelPrefix.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":90,"kind":1024,"name":"data","url":"classes/errors.ErrorDBLevelPrefix.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":91,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBLevelPrefix.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":92,"kind":128,"name":"ErrorDBDecrypt","url":"classes/errors.ErrorDBDecrypt.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":93,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDecrypt.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDecrypt"},{"id":94,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDecrypt.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":95,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDecrypt.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":96,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDecrypt.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":97,"kind":128,"name":"ErrorDBParse","url":"classes/errors.ErrorDBParse.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":98,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBParse.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBParse"},{"id":99,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBParse.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":100,"kind":1024,"name":"data","url":"classes/errors.ErrorDBParse.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":101,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBParse.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":102,"kind":128,"name":"ErrorDBCommitted","url":"classes/errors.ErrorDBCommitted.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":103,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBCommitted.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBCommitted"},{"id":104,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBCommitted.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCommitted"},{"id":105,"kind":1024,"name":"data","url":"classes/errors.ErrorDBCommitted.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCommitted"},{"id":106,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBCommitted.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCommitted"},{"id":107,"kind":128,"name":"ErrorDBNotCommited","url":"classes/errors.ErrorDBNotCommited.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":108,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBNotCommited.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBNotCommited"},{"id":109,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBNotCommited.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotCommited"},{"id":110,"kind":1024,"name":"data","url":"classes/errors.ErrorDBNotCommited.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotCommited"},{"id":111,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBNotCommited.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotCommited"},{"id":112,"kind":128,"name":"ErrorDBRollbacked","url":"classes/errors.ErrorDBRollbacked.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":113,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBRollbacked.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBRollbacked"},{"id":114,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBRollbacked.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRollbacked"},{"id":115,"kind":1024,"name":"data","url":"classes/errors.ErrorDBRollbacked.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRollbacked"},{"id":116,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBRollbacked.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRollbacked"},{"id":117,"kind":1,"name":"index","url":"modules/index.html","classes":"tsd-kind-module"},{"id":118,"kind":1,"name":"types","url":"modules/types.html","classes":"tsd-kind-module"},{"id":119,"kind":4194304,"name":"POJO","url":"modules/types.html#POJO","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":120,"kind":65536,"name":"__type","url":"modules/types.html#POJO.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"types.POJO"},{"id":121,"kind":256,"name":"FileSystem","url":"interfaces/types.FileSystem.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"types"},{"id":122,"kind":1024,"name":"promises","url":"interfaces/types.FileSystem.html#promises","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.FileSystem"},{"id":123,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-interface","parent":"types.FileSystem"},{"id":124,"kind":1024,"name":"rm","url":"interfaces/types.FileSystem.html#__type.rm","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":125,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":126,"kind":1024,"name":"mkdir","url":"interfaces/types.FileSystem.html#__type.mkdir","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":127,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":128,"kind":4194304,"name":"Crypto","url":"modules/types.html#Crypto","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":129,"kind":65536,"name":"__type","url":"modules/types.html#Crypto.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"types.Crypto"},{"id":130,"kind":2048,"name":"encrypt","url":"modules/types.html#Crypto.__type.encrypt","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.Crypto.__type"},{"id":131,"kind":2048,"name":"decrypt","url":"modules/types.html#Crypto.__type.decrypt","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.Crypto.__type"},{"id":132,"kind":4194304,"name":"DBWorkerManagerInterface","url":"modules/types.html#DBWorkerManagerInterface","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":133,"kind":4194304,"name":"DBDomain","url":"modules/types.html#DBDomain","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":134,"kind":4194304,"name":"DBLevel","url":"modules/types.html#DBLevel","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":135,"kind":4194304,"name":"DBOp","url":"modules/types.html#DBOp","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":136,"kind":4194304,"name":"DBOps","url":"modules/types.html#DBOps","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":137,"kind":256,"name":"DBTransaction","url":"interfaces/types.DBTransaction.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"types"},{"id":138,"kind":1024,"name":"ops","url":"interfaces/types.DBTransaction.html#ops","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":139,"kind":1024,"name":"snap","url":"interfaces/types.DBTransaction.html#snap","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":140,"kind":1024,"name":"callbacksSuccess","url":"interfaces/types.DBTransaction.html#callbacksSuccess","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":141,"kind":1024,"name":"callbacksFailure","url":"interfaces/types.DBTransaction.html#callbacksFailure","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":142,"kind":1024,"name":"committed","url":"interfaces/types.DBTransaction.html#committed","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":143,"kind":2048,"name":"get","url":"interfaces/types.DBTransaction.html#get","classes":"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter","parent":"types.DBTransaction"},{"id":144,"kind":2048,"name":"put","url":"interfaces/types.DBTransaction.html#put","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":145,"kind":2048,"name":"del","url":"interfaces/types.DBTransaction.html#del","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":146,"kind":2048,"name":"queueSuccess","url":"interfaces/types.DBTransaction.html#queueSuccess","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":147,"kind":2048,"name":"queueFailure","url":"interfaces/types.DBTransaction.html#queueFailure","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"types.DBTransaction"},{"id":148,"kind":1,"name":"utils","url":"modules/utils.html","classes":"tsd-kind-module"},{"id":149,"kind":32,"name":"prefix","url":"modules/utils.html#prefix","classes":"tsd-kind-variable tsd-parent-kind-module","parent":"utils"},{"id":150,"kind":64,"name":"domainPath","url":"modules/utils.html#domainPath","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":151,"kind":64,"name":"serialize","url":"modules/utils.html#serialize","classes":"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter","parent":"utils"},{"id":152,"kind":64,"name":"deserialize","url":"modules/utils.html#deserialize","classes":"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter","parent":"utils"},{"id":153,"kind":64,"name":"toArrayBuffer","url":"modules/utils.html#toArrayBuffer","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":154,"kind":64,"name":"fromArrayBuffer","url":"modules/utils.html#fromArrayBuffer","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":155,"kind":16777216,"name":"DB","url":"modules/index.html#DB","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":156,"kind":16777216,"name":"Transaction","url":"modules/index.html#Transaction","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":157,"kind":16777216,"name":"utils","url":"modules/index.html#utils","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":158,"kind":16777216,"name":"errors","url":"modules/index.html#errors","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":159,"kind":16777216,"name":"POJO","url":"modules/index.html#POJO","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":160,"kind":16777216,"name":"FileSystem","url":"modules/index.html#FileSystem","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":161,"kind":16777216,"name":"Crypto","url":"modules/index.html#Crypto","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":162,"kind":16777216,"name":"DBWorkerManagerInterface","url":"modules/index.html#DBWorkerManagerInterface","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":163,"kind":16777216,"name":"DBDomain","url":"modules/index.html#DBDomain","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":164,"kind":16777216,"name":"DBLevel","url":"modules/index.html#DBLevel","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":165,"kind":16777216,"name":"DBOp","url":"modules/index.html#DBOp","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":166,"kind":16777216,"name":"DBOps","url":"modules/index.html#DBOps","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":167,"kind":16777216,"name":"DBTransaction","url":"modules/index.html#DBTransaction","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,34.252]],["parent/0",[]],["name/1",[1,42.136]],["parent/1",[0,3.374]],["name/2",[2,47.244]],["parent/2",[3,1.789]],["name/3",[4,24.558]],["parent/3",[3,1.789]],["name/4",[5,47.244]],["parent/4",[3,1.789]],["name/5",[6,38.771]],["parent/5",[3,1.789]],["name/6",[7,22.121]],["parent/6",[3,1.789]],["name/7",[8,47.244]],["parent/7",[9,4.151]],["name/8",[10,38.771]],["parent/8",[9,4.151]],["name/9",[11,47.244]],["parent/9",[3,1.789]],["name/10",[12,47.244]],["parent/10",[3,1.789]],["name/11",[13,42.136]],["parent/11",[3,1.789]],["name/12",[14,47.244]],["parent/12",[3,1.789]],["name/13",[15,47.244]],["parent/13",[3,1.789]],["name/14",[0,34.252]],["parent/14",[3,1.789]],["name/15",[16,47.244]],["parent/15",[3,1.789]],["name/16",[17,47.244]],["parent/16",[3,1.789]],["name/17",[18,47.244]],["parent/17",[3,1.789]],["name/18",[19,47.244]],["parent/18",[3,1.789]],["name/19",[20,47.244]],["parent/19",[3,1.789]],["name/20",[21,47.244]],["parent/20",[3,1.789]],["name/21",[22,47.244]],["parent/21",[3,1.789]],["name/22",[23,47.244]],["parent/22",[3,1.789]],["name/23",[24,47.244]],["parent/23",[3,1.789]],["name/24",[25,47.244]],["parent/24",[3,1.789]],["name/25",[26,38.771]],["parent/25",[3,1.789]],["name/26",[27,38.771]],["parent/26",[3,1.789]],["name/27",[28,38.771]],["parent/27",[3,1.789]],["name/28",[29,47.244]],["parent/28",[3,1.789]],["name/29",[30,47.244]],["parent/29",[3,1.789]],["name/30",[31,47.244]],["parent/30",[3,1.789]],["name/31",[32,38.771]],["parent/31",[]],["name/32",[1,42.136]],["parent/32",[32,3.819]],["name/33",[4,24.558]],["parent/33",[33,1.943]],["name/34",[0,34.252]],["parent/34",[33,1.943]],["name/35",[13,42.136]],["parent/35",[33,1.943]],["name/36",[34,47.244]],["parent/36",[33,1.943]],["name/37",[35,47.244]],["parent/37",[33,1.943]],["name/38",[36,47.244]],["parent/38",[33,1.943]],["name/39",[37,47.244]],["parent/39",[33,1.943]],["name/40",[38,47.244]],["parent/40",[33,1.943]],["name/41",[39,47.244]],["parent/41",[33,1.943]],["name/42",[10,38.771]],["parent/42",[33,1.943]],["name/43",[40,42.136]],["parent/43",[33,1.943]],["name/44",[41,42.136]],["parent/44",[33,1.943]],["name/45",[42,42.136]],["parent/45",[33,1.943]],["name/46",[43,42.136]],["parent/46",[33,1.943]],["name/47",[44,47.244]],["parent/47",[33,1.943]],["name/48",[26,38.771]],["parent/48",[33,1.943]],["name/49",[27,38.771]],["parent/49",[33,1.943]],["name/50",[28,38.771]],["parent/50",[33,1.943]],["name/51",[45,42.136]],["parent/51",[33,1.943]],["name/52",[46,42.136]],["parent/52",[33,1.943]],["name/53",[47,47.244]],["parent/53",[33,1.943]],["name/54",[48,47.244]],["parent/54",[33,1.943]],["name/55",[49,47.244]],["parent/55",[33,1.943]],["name/56",[50,24.558]],["parent/56",[]],["name/57",[51,47.244]],["parent/57",[50,2.419]],["name/58",[7,22.121]],["parent/58",[52,3.572]],["name/59",[4,24.558]],["parent/59",[52,3.572]],["name/60",[53,26.042]],["parent/60",[52,3.572]],["name/61",[54,26.042]],["parent/61",[52,3.572]],["name/62",[55,47.244]],["parent/62",[50,2.419]],["name/63",[7,22.121]],["parent/63",[56,3.572]],["name/64",[4,24.558]],["parent/64",[56,3.572]],["name/65",[53,26.042]],["parent/65",[56,3.572]],["name/66",[54,26.042]],["parent/66",[56,3.572]],["name/67",[57,47.244]],["parent/67",[50,2.419]],["name/68",[7,22.121]],["parent/68",[58,3.572]],["name/69",[4,24.558]],["parent/69",[58,3.572]],["name/70",[53,26.042]],["parent/70",[58,3.572]],["name/71",[54,26.042]],["parent/71",[58,3.572]],["name/72",[59,47.244]],["parent/72",[50,2.419]],["name/73",[7,22.121]],["parent/73",[60,3.572]],["name/74",[4,24.558]],["parent/74",[60,3.572]],["name/75",[53,26.042]],["parent/75",[60,3.572]],["name/76",[54,26.042]],["parent/76",[60,3.572]],["name/77",[61,47.244]],["parent/77",[50,2.419]],["name/78",[7,22.121]],["parent/78",[62,3.572]],["name/79",[4,24.558]],["parent/79",[62,3.572]],["name/80",[53,26.042]],["parent/80",[62,3.572]],["name/81",[54,26.042]],["parent/81",[62,3.572]],["name/82",[63,47.244]],["parent/82",[50,2.419]],["name/83",[7,22.121]],["parent/83",[64,3.572]],["name/84",[4,24.558]],["parent/84",[64,3.572]],["name/85",[53,26.042]],["parent/85",[64,3.572]],["name/86",[54,26.042]],["parent/86",[64,3.572]],["name/87",[65,47.244]],["parent/87",[50,2.419]],["name/88",[7,22.121]],["parent/88",[66,3.572]],["name/89",[4,24.558]],["parent/89",[66,3.572]],["name/90",[53,26.042]],["parent/90",[66,3.572]],["name/91",[54,26.042]],["parent/91",[66,3.572]],["name/92",[67,47.244]],["parent/92",[50,2.419]],["name/93",[7,22.121]],["parent/93",[68,3.572]],["name/94",[4,24.558]],["parent/94",[68,3.572]],["name/95",[53,26.042]],["parent/95",[68,3.572]],["name/96",[54,26.042]],["parent/96",[68,3.572]],["name/97",[69,47.244]],["parent/97",[50,2.419]],["name/98",[7,22.121]],["parent/98",[70,3.572]],["name/99",[4,24.558]],["parent/99",[70,3.572]],["name/100",[53,26.042]],["parent/100",[70,3.572]],["name/101",[54,26.042]],["parent/101",[70,3.572]],["name/102",[71,47.244]],["parent/102",[50,2.419]],["name/103",[7,22.121]],["parent/103",[72,3.572]],["name/104",[4,24.558]],["parent/104",[72,3.572]],["name/105",[53,26.042]],["parent/105",[72,3.572]],["name/106",[54,26.042]],["parent/106",[72,3.572]],["name/107",[73,47.244]],["parent/107",[50,2.419]],["name/108",[7,22.121]],["parent/108",[74,3.572]],["name/109",[4,24.558]],["parent/109",[74,3.572]],["name/110",[53,26.042]],["parent/110",[74,3.572]],["name/111",[54,26.042]],["parent/111",[74,3.572]],["name/112",[75,47.244]],["parent/112",[50,2.419]],["name/113",[7,22.121]],["parent/113",[76,3.572]],["name/114",[4,24.558]],["parent/114",[76,3.572]],["name/115",[53,26.042]],["parent/115",[76,3.572]],["name/116",[54,26.042]],["parent/116",[76,3.572]],["name/117",[77,24.558]],["parent/117",[]],["name/118",[78,27.785]],["parent/118",[]],["name/119",[79,42.136]],["parent/119",[78,2.737]],["name/120",[7,22.121]],["parent/120",[80,4.654]],["name/121",[81,42.136]],["parent/121",[78,2.737]],["name/122",[82,47.244]],["parent/122",[83,4.151]],["name/123",[7,22.121]],["parent/123",[83,4.151]],["name/124",[84,47.244]],["parent/124",[85,3.572]],["name/125",[7,22.121]],["parent/125",[85,3.572]],["name/126",[86,47.244]],["parent/126",[85,3.572]],["name/127",[7,22.121]],["parent/127",[85,3.572]],["name/128",[6,38.771]],["parent/128",[78,2.737]],["name/129",[7,22.121]],["parent/129",[87,4.654]],["name/130",[88,47.244]],["parent/130",[89,4.151]],["name/131",[90,47.244]],["parent/131",[89,4.151]],["name/132",[91,42.136]],["parent/132",[78,2.737]],["name/133",[92,42.136]],["parent/133",[78,2.737]],["name/134",[93,42.136]],["parent/134",[78,2.737]],["name/135",[94,42.136]],["parent/135",[78,2.737]],["name/136",[95,42.136]],["parent/136",[78,2.737]],["name/137",[96,42.136]],["parent/137",[78,2.737]],["name/138",[10,38.771]],["parent/138",[97,2.737]],["name/139",[40,42.136]],["parent/139",[97,2.737]],["name/140",[41,42.136]],["parent/140",[97,2.737]],["name/141",[42,42.136]],["parent/141",[97,2.737]],["name/142",[43,42.136]],["parent/142",[97,2.737]],["name/143",[26,38.771]],["parent/143",[97,2.737]],["name/144",[27,38.771]],["parent/144",[97,2.737]],["name/145",[28,38.771]],["parent/145",[97,2.737]],["name/146",[45,42.136]],["parent/146",[97,2.737]],["name/147",[46,42.136]],["parent/147",[97,2.737]],["name/148",[98,29.898]],["parent/148",[]],["name/149",[99,47.244]],["parent/149",[98,2.945]],["name/150",[100,47.244]],["parent/150",[98,2.945]],["name/151",[101,47.244]],["parent/151",[98,2.945]],["name/152",[102,47.244]],["parent/152",[98,2.945]],["name/153",[103,47.244]],["parent/153",[98,2.945]],["name/154",[104,47.244]],["parent/154",[98,2.945]],["name/155",[0,34.252]],["parent/155",[77,2.419]],["name/156",[32,38.771]],["parent/156",[77,2.419]],["name/157",[98,29.898]],["parent/157",[77,2.419]],["name/158",[50,24.558]],["parent/158",[77,2.419]],["name/159",[79,42.136]],["parent/159",[77,2.419]],["name/160",[81,42.136]],["parent/160",[77,2.419]],["name/161",[6,38.771]],["parent/161",[77,2.419]],["name/162",[91,42.136]],["parent/162",[77,2.419]],["name/163",[92,42.136]],["parent/163",[77,2.419]],["name/164",[93,42.136]],["parent/164",[77,2.419]],["name/165",[94,42.136]],["parent/165",[77,2.419]],["name/166",[95,42.136]],["parent/166",[77,2.419]],["name/167",[96,42.136]],["parent/167",[77,2.419]]],"invertedIndex":[["__type",{"_index":7,"name":{"6":{},"58":{},"63":{},"68":{},"73":{},"78":{},"83":{},"88":{},"93":{},"98":{},"103":{},"108":{},"113":{},"120":{},"123":{},"125":{},"127":{},"129":{}},"parent":{}}],["_callbacksfailure",{"_index":37,"name":{"39":{}},"parent":{}}],["_callbackssuccess",{"_index":36,"name":{"38":{}},"parent":{}}],["_committed",{"_index":38,"name":{"40":{}},"parent":{}}],["_db",{"_index":15,"name":{"13":{}},"parent":{}}],["_ops",{"_index":34,"name":{"36":{}},"parent":{}}],["_rollbacked",{"_index":39,"name":{"41":{}},"parent":{}}],["_snap",{"_index":35,"name":{"37":{}},"parent":{}}],["batch",{"_index":29,"name":{"28":{}},"parent":{}}],["callbacksfailure",{"_index":42,"name":{"45":{},"141":{}},"parent":{}}],["callbackssuccess",{"_index":41,"name":{"44":{},"140":{}},"parent":{}}],["cause",{"_index":54,"name":{"61":{},"66":{},"71":{},"76":{},"81":{},"86":{},"91":{},"96":{},"101":{},"106":{},"111":{},"116":{}},"parent":{}}],["commit",{"_index":47,"name":{"53":{}},"parent":{}}],["committed",{"_index":43,"name":{"46":{},"142":{}},"parent":{}}],["constructor",{"_index":4,"name":{"3":{},"33":{},"59":{},"64":{},"69":{},"74":{},"79":{},"84":{},"89":{},"94":{},"99":{},"104":{},"109":{},"114":{}},"parent":{}}],["count",{"_index":25,"name":{"24":{}},"parent":{}}],["createdb",{"_index":2,"name":{"2":{}},"parent":{}}],["crypto",{"_index":6,"name":{"5":{},"128":{},"161":{}},"parent":{}}],["data",{"_index":53,"name":{"60":{},"65":{},"70":{},"75":{},"80":{},"85":{},"90":{},"95":{},"100":{},"105":{},"110":{},"115":{}},"parent":{}}],["db",{"_index":0,"name":{"0":{},"14":{},"34":{},"155":{}},"parent":{"1":{}}}],["db.default",{"_index":3,"name":{},"parent":{"2":{},"3":{},"4":{},"5":{},"6":{},"9":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"30":{}}}],["db.default.__type",{"_index":9,"name":{},"parent":{"7":{},"8":{}}}],["dbdomain",{"_index":92,"name":{"133":{},"163":{}},"parent":{}}],["dblevel",{"_index":93,"name":{"134":{},"164":{}},"parent":{}}],["dbop",{"_index":94,"name":{"135":{},"165":{}},"parent":{}}],["dbops",{"_index":95,"name":{"136":{},"166":{}},"parent":{}}],["dbpath",{"_index":5,"name":{"4":{}},"parent":{}}],["dbtransaction",{"_index":96,"name":{"137":{},"167":{}},"parent":{}}],["dbworkermanagerinterface",{"_index":91,"name":{"132":{},"162":{}},"parent":{}}],["decrypt",{"_index":90,"name":{"131":{}},"parent":{}}],["default",{"_index":1,"name":{"1":{},"32":{}},"parent":{}}],["del",{"_index":28,"name":{"27":{},"50":{},"145":{}},"parent":{}}],["deserialize",{"_index":102,"name":{"152":{}},"parent":{}}],["deserializedecrypt",{"_index":31,"name":{"30":{}},"parent":{}}],["destroy",{"_index":19,"name":{"18":{}},"parent":{}}],["domainpath",{"_index":100,"name":{"150":{}},"parent":{}}],["encrypt",{"_index":88,"name":{"130":{}},"parent":{}}],["errordb",{"_index":51,"name":{"57":{}},"parent":{}}],["errordbcommitted",{"_index":71,"name":{"102":{}},"parent":{}}],["errordbcreate",{"_index":61,"name":{"77":{}},"parent":{}}],["errordbdecrypt",{"_index":67,"name":{"92":{}},"parent":{}}],["errordbdelete",{"_index":63,"name":{"82":{}},"parent":{}}],["errordbdestroyed",{"_index":59,"name":{"72":{}},"parent":{}}],["errordblevelprefix",{"_index":65,"name":{"87":{}},"parent":{}}],["errordbnotcommited",{"_index":73,"name":{"107":{}},"parent":{}}],["errordbnotrunning",{"_index":57,"name":{"67":{}},"parent":{}}],["errordbparse",{"_index":69,"name":{"97":{}},"parent":{}}],["errordbrollbacked",{"_index":75,"name":{"112":{}},"parent":{}}],["errordbrunning",{"_index":55,"name":{"62":{}},"parent":{}}],["errors",{"_index":50,"name":{"56":{},"158":{}},"parent":{"57":{},"62":{},"67":{},"72":{},"77":{},"82":{},"87":{},"92":{},"97":{},"102":{},"107":{},"112":{}}}],["errors.errordb",{"_index":52,"name":{},"parent":{"58":{},"59":{},"60":{},"61":{}}}],["errors.errordbcommitted",{"_index":72,"name":{},"parent":{"103":{},"104":{},"105":{},"106":{}}}],["errors.errordbcreate",{"_index":62,"name":{},"parent":{"78":{},"79":{},"80":{},"81":{}}}],["errors.errordbdecrypt",{"_index":68,"name":{},"parent":{"93":{},"94":{},"95":{},"96":{}}}],["errors.errordbdelete",{"_index":64,"name":{},"parent":{"83":{},"84":{},"85":{},"86":{}}}],["errors.errordbdestroyed",{"_index":60,"name":{},"parent":{"73":{},"74":{},"75":{},"76":{}}}],["errors.errordblevelprefix",{"_index":66,"name":{},"parent":{"88":{},"89":{},"90":{},"91":{}}}],["errors.errordbnotcommited",{"_index":74,"name":{},"parent":{"108":{},"109":{},"110":{},"111":{}}}],["errors.errordbnotrunning",{"_index":58,"name":{},"parent":{"68":{},"69":{},"70":{},"71":{}}}],["errors.errordbparse",{"_index":70,"name":{},"parent":{"98":{},"99":{},"100":{},"101":{}}}],["errors.errordbrollbacked",{"_index":76,"name":{},"parent":{"113":{},"114":{},"115":{},"116":{}}}],["errors.errordbrunning",{"_index":56,"name":{},"parent":{"63":{},"64":{},"65":{},"66":{}}}],["filesystem",{"_index":81,"name":{"121":{},"160":{}},"parent":{}}],["finalize",{"_index":49,"name":{"55":{}},"parent":{}}],["fromarraybuffer",{"_index":104,"name":{"154":{}},"parent":{}}],["fs",{"_index":12,"name":{"10":{}},"parent":{}}],["get",{"_index":26,"name":{"25":{},"48":{},"143":{}},"parent":{}}],["index",{"_index":77,"name":{"117":{}},"parent":{"155":{},"156":{},"157":{},"158":{},"159":{},"160":{},"161":{},"162":{},"163":{},"164":{},"165":{},"166":{},"167":{}}}],["key",{"_index":8,"name":{"7":{}},"parent":{}}],["level",{"_index":24,"name":{"23":{}},"parent":{}}],["lock",{"_index":11,"name":{"9":{}},"parent":{}}],["locked",{"_index":16,"name":{"15":{}},"parent":{}}],["logger",{"_index":13,"name":{"11":{},"35":{}},"parent":{}}],["mkdir",{"_index":86,"name":{"126":{}},"parent":{}}],["ops",{"_index":10,"name":{"8":{},"42":{},"138":{}},"parent":{}}],["pojo",{"_index":79,"name":{"119":{},"159":{}},"parent":{}}],["prefix",{"_index":99,"name":{"149":{}},"parent":{}}],["promises",{"_index":82,"name":{"122":{}},"parent":{}}],["put",{"_index":27,"name":{"26":{},"49":{},"144":{}},"parent":{}}],["queuefailure",{"_index":46,"name":{"52":{},"147":{}},"parent":{}}],["queuesuccess",{"_index":45,"name":{"51":{},"146":{}},"parent":{}}],["rm",{"_index":84,"name":{"124":{}},"parent":{}}],["rollback",{"_index":48,"name":{"54":{}},"parent":{}}],["rollbacked",{"_index":44,"name":{"47":{}},"parent":{}}],["serialize",{"_index":101,"name":{"151":{}},"parent":{}}],["serializeencrypt",{"_index":30,"name":{"29":{}},"parent":{}}],["setworkermanager",{"_index":20,"name":{"19":{}},"parent":{}}],["snap",{"_index":40,"name":{"43":{},"139":{}},"parent":{}}],["start",{"_index":17,"name":{"16":{}},"parent":{}}],["stop",{"_index":18,"name":{"17":{}},"parent":{}}],["toarraybuffer",{"_index":103,"name":{"153":{}},"parent":{}}],["transact",{"_index":23,"name":{"22":{}},"parent":{}}],["transaction",{"_index":32,"name":{"31":{},"156":{}},"parent":{"32":{}}}],["transaction.default",{"_index":33,"name":{},"parent":{"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{},"48":{},"49":{},"50":{},"51":{},"52":{},"53":{},"54":{},"55":{}}}],["types",{"_index":78,"name":{"118":{}},"parent":{"119":{},"121":{},"128":{},"132":{},"133":{},"134":{},"135":{},"136":{},"137":{}}}],["types.crypto",{"_index":87,"name":{},"parent":{"129":{}}}],["types.crypto.__type",{"_index":89,"name":{},"parent":{"130":{},"131":{}}}],["types.dbtransaction",{"_index":97,"name":{},"parent":{"138":{},"139":{},"140":{},"141":{},"142":{},"143":{},"144":{},"145":{},"146":{},"147":{}}}],["types.filesystem",{"_index":83,"name":{},"parent":{"122":{},"123":{}}}],["types.filesystem.__type",{"_index":85,"name":{},"parent":{"124":{},"125":{},"126":{},"127":{}}}],["types.pojo",{"_index":80,"name":{},"parent":{"120":{}}}],["unsetworkermanager",{"_index":21,"name":{"20":{}},"parent":{}}],["utils",{"_index":98,"name":{"148":{},"157":{}},"parent":{"149":{},"150":{},"151":{},"152":{},"153":{},"154":{}}}],["withlocks",{"_index":22,"name":{"21":{}},"parent":{}}],["workermanager",{"_index":14,"name":{"12":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file +window.searchData = {"kinds":{"1":"Module","32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias","16777216":"Reference"},"rows":[{"id":0,"kind":1,"name":"DB","url":"modules/DB.html","classes":"tsd-kind-module"},{"id":1,"kind":128,"name":"default","url":"classes/DB.default.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"DB"},{"id":2,"kind":2048,"name":"createDB","url":"classes/DB.default.html#createDB","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"DB.default"},{"id":3,"kind":512,"name":"constructor","url":"classes/DB.default.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":4,"kind":1024,"name":"dbPath","url":"classes/DB.default.html#dbPath","classes":"tsd-kind-property tsd-parent-kind-class","parent":"DB.default"},{"id":5,"kind":1024,"name":"crypto","url":"classes/DB.default.html#crypto","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":6,"kind":65536,"name":"__type","url":"classes/DB.default.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"DB.default"},{"id":7,"kind":1024,"name":"key","url":"classes/DB.default.html#__type.key","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"DB.default.__type"},{"id":8,"kind":1024,"name":"ops","url":"classes/DB.default.html#__type.ops","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"DB.default.__type"},{"id":9,"kind":1024,"name":"fs","url":"classes/DB.default.html#fs","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":10,"kind":1024,"name":"logger","url":"classes/DB.default.html#logger","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":11,"kind":1024,"name":"workerManager","url":"classes/DB.default.html#workerManager","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":12,"kind":1024,"name":"_db","url":"classes/DB.default.html#_db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":13,"kind":1024,"name":"_dataDb","url":"classes/DB.default.html#_dataDb","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":14,"kind":1024,"name":"_transactionsDb","url":"classes/DB.default.html#_transactionsDb","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":15,"kind":1024,"name":"transactionCounter","url":"classes/DB.default.html#transactionCounter","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":16,"kind":262144,"name":"db","url":"classes/DB.default.html#db","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DB.default"},{"id":17,"kind":262144,"name":"dataDb","url":"classes/DB.default.html#dataDb","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DB.default"},{"id":18,"kind":262144,"name":"transactionsDb","url":"classes/DB.default.html#transactionsDb","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DB.default"},{"id":19,"kind":2048,"name":"start","url":"classes/DB.default.html#start","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":20,"kind":2048,"name":"stop","url":"classes/DB.default.html#stop","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":21,"kind":2048,"name":"destroy","url":"classes/DB.default.html#destroy","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DB.default"},{"id":22,"kind":2048,"name":"setWorkerManager","url":"classes/DB.default.html#setWorkerManager","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":23,"kind":2048,"name":"unsetWorkerManager","url":"classes/DB.default.html#unsetWorkerManager","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":24,"kind":2048,"name":"transaction","url":"classes/DB.default.html#transaction","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":25,"kind":2048,"name":"level","url":"classes/DB.default.html#level","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":26,"kind":2048,"name":"iterator","url":"classes/DB.default.html#iterator","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":27,"kind":2048,"name":"clear","url":"classes/DB.default.html#clear","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":28,"kind":2048,"name":"count","url":"classes/DB.default.html#count","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":29,"kind":2048,"name":"dump","url":"classes/DB.default.html#dump","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":30,"kind":2048,"name":"get","url":"classes/DB.default.html#get","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":31,"kind":2048,"name":"put","url":"classes/DB.default.html#put","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":32,"kind":2048,"name":"del","url":"classes/DB.default.html#del","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":33,"kind":2048,"name":"batch","url":"classes/DB.default.html#batch","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":34,"kind":2048,"name":"serializeEncrypt","url":"classes/DB.default.html#serializeEncrypt","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DB.default"},{"id":35,"kind":2048,"name":"deserializeDecrypt","url":"classes/DB.default.html#deserializeDecrypt","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DB.default"},{"id":36,"kind":2048,"name":"setupDb","url":"classes/DB.default.html#setupDb","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":37,"kind":2048,"name":"setupRootLevels","url":"classes/DB.default.html#setupRootLevels","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":38,"kind":2048,"name":"_level","url":"classes/DB.default.html#_level","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-protected","parent":"DB.default"},{"id":39,"kind":1,"name":"DBTransaction","url":"modules/DBTransaction.html","classes":"tsd-kind-module"},{"id":40,"kind":128,"name":"default","url":"classes/DBTransaction.default.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"DBTransaction"},{"id":41,"kind":2048,"name":"createTransaction","url":"classes/DBTransaction.default.html#createTransaction","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"DBTransaction.default"},{"id":42,"kind":512,"name":"constructor","url":"classes/DBTransaction.default.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"DBTransaction.default"},{"id":43,"kind":1024,"name":"transactionId","url":"classes/DBTransaction.default.html#transactionId","classes":"tsd-kind-property tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":44,"kind":1024,"name":"db","url":"classes/DBTransaction.default.html#db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":45,"kind":1024,"name":"transactionDb","url":"classes/DBTransaction.default.html#transactionDb","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":46,"kind":1024,"name":"logger","url":"classes/DBTransaction.default.html#logger","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":47,"kind":1024,"name":"_ops","url":"classes/DBTransaction.default.html#_ops","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":48,"kind":1024,"name":"_callbacksSuccess","url":"classes/DBTransaction.default.html#_callbacksSuccess","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":49,"kind":1024,"name":"_callbacksFailure","url":"classes/DBTransaction.default.html#_callbacksFailure","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":50,"kind":1024,"name":"_committed","url":"classes/DBTransaction.default.html#_committed","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":51,"kind":1024,"name":"_rollbacked","url":"classes/DBTransaction.default.html#_rollbacked","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"DBTransaction.default"},{"id":52,"kind":2048,"name":"destroy","url":"classes/DBTransaction.default.html#destroy","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"DBTransaction.default"},{"id":53,"kind":262144,"name":"ops","url":"classes/DBTransaction.default.html#ops","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":54,"kind":262144,"name":"callbacksSuccess","url":"classes/DBTransaction.default.html#callbacksSuccess","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":55,"kind":262144,"name":"callbacksFailure","url":"classes/DBTransaction.default.html#callbacksFailure","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":56,"kind":262144,"name":"committed","url":"classes/DBTransaction.default.html#committed","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":57,"kind":262144,"name":"rollbacked","url":"classes/DBTransaction.default.html#rollbacked","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":58,"kind":2048,"name":"dump","url":"classes/DBTransaction.default.html#dump","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":59,"kind":2048,"name":"iterator","url":"classes/DBTransaction.default.html#iterator","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":60,"kind":2048,"name":"clear","url":"classes/DBTransaction.default.html#clear","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":61,"kind":2048,"name":"count","url":"classes/DBTransaction.default.html#count","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":62,"kind":2048,"name":"get","url":"classes/DBTransaction.default.html#get","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"DBTransaction.default"},{"id":63,"kind":2048,"name":"put","url":"classes/DBTransaction.default.html#put","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":64,"kind":2048,"name":"del","url":"classes/DBTransaction.default.html#del","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":65,"kind":2048,"name":"queueSuccess","url":"classes/DBTransaction.default.html#queueSuccess","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":66,"kind":2048,"name":"queueFailure","url":"classes/DBTransaction.default.html#queueFailure","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":67,"kind":2048,"name":"commit","url":"classes/DBTransaction.default.html#commit","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":68,"kind":2048,"name":"rollback","url":"classes/DBTransaction.default.html#rollback","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":69,"kind":2048,"name":"finalize","url":"classes/DBTransaction.default.html#finalize","classes":"tsd-kind-method tsd-parent-kind-class","parent":"DBTransaction.default"},{"id":70,"kind":1,"name":"errors","url":"modules/errors.html","classes":"tsd-kind-module"},{"id":71,"kind":128,"name":"ErrorDB","url":"classes/errors.ErrorDB.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":72,"kind":65536,"name":"__type","url":"classes/errors.ErrorDB.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":73,"kind":512,"name":"constructor","url":"classes/errors.ErrorDB.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"errors.ErrorDB"},{"id":74,"kind":1024,"name":"data","url":"classes/errors.ErrorDB.html#data","classes":"tsd-kind-property tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":75,"kind":1024,"name":"cause","url":"classes/errors.ErrorDB.html#cause","classes":"tsd-kind-property tsd-parent-kind-class","parent":"errors.ErrorDB"},{"id":76,"kind":128,"name":"ErrorDBRunning","url":"classes/errors.ErrorDBRunning.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":77,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBRunning.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBRunning"},{"id":78,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBRunning.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":79,"kind":1024,"name":"data","url":"classes/errors.ErrorDBRunning.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":80,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBRunning.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBRunning"},{"id":81,"kind":128,"name":"ErrorDBNotRunning","url":"classes/errors.ErrorDBNotRunning.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":82,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBNotRunning.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBNotRunning"},{"id":83,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBNotRunning.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":84,"kind":1024,"name":"data","url":"classes/errors.ErrorDBNotRunning.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":85,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBNotRunning.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBNotRunning"},{"id":86,"kind":128,"name":"ErrorDBDestroyed","url":"classes/errors.ErrorDBDestroyed.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":87,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDestroyed.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDestroyed"},{"id":88,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDestroyed.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":89,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDestroyed.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":90,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDestroyed.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDestroyed"},{"id":91,"kind":128,"name":"ErrorDBCreate","url":"classes/errors.ErrorDBCreate.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":92,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBCreate.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBCreate"},{"id":93,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBCreate.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":94,"kind":1024,"name":"data","url":"classes/errors.ErrorDBCreate.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":95,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBCreate.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBCreate"},{"id":96,"kind":128,"name":"ErrorDBDelete","url":"classes/errors.ErrorDBDelete.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":97,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDelete.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDelete"},{"id":98,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDelete.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":99,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDelete.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":100,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDelete.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDelete"},{"id":101,"kind":128,"name":"ErrorDBLevelPrefix","url":"classes/errors.ErrorDBLevelPrefix.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":102,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBLevelPrefix.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBLevelPrefix"},{"id":103,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBLevelPrefix.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":104,"kind":1024,"name":"data","url":"classes/errors.ErrorDBLevelPrefix.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":105,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBLevelPrefix.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBLevelPrefix"},{"id":106,"kind":128,"name":"ErrorDBDecrypt","url":"classes/errors.ErrorDBDecrypt.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":107,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBDecrypt.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBDecrypt"},{"id":108,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBDecrypt.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":109,"kind":1024,"name":"data","url":"classes/errors.ErrorDBDecrypt.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":110,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBDecrypt.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBDecrypt"},{"id":111,"kind":128,"name":"ErrorDBParse","url":"classes/errors.ErrorDBParse.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":112,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBParse.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBParse"},{"id":113,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBParse.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":114,"kind":1024,"name":"data","url":"classes/errors.ErrorDBParse.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":115,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBParse.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBParse"},{"id":116,"kind":128,"name":"ErrorDBTransactionDestroyed","url":"classes/errors.ErrorDBTransactionDestroyed.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":117,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBTransactionDestroyed.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBTransactionDestroyed"},{"id":118,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBTransactionDestroyed.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionDestroyed"},{"id":119,"kind":1024,"name":"data","url":"classes/errors.ErrorDBTransactionDestroyed.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionDestroyed"},{"id":120,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBTransactionDestroyed.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionDestroyed"},{"id":121,"kind":128,"name":"ErrorDBTransactionCommitted","url":"classes/errors.ErrorDBTransactionCommitted.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":122,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBTransactionCommitted.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBTransactionCommitted"},{"id":123,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBTransactionCommitted.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionCommitted"},{"id":124,"kind":1024,"name":"data","url":"classes/errors.ErrorDBTransactionCommitted.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionCommitted"},{"id":125,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBTransactionCommitted.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionCommitted"},{"id":126,"kind":128,"name":"ErrorDBTransactionNotCommited","url":"classes/errors.ErrorDBTransactionNotCommited.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":127,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBTransactionNotCommited.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBTransactionNotCommited"},{"id":128,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBTransactionNotCommited.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionNotCommited"},{"id":129,"kind":1024,"name":"data","url":"classes/errors.ErrorDBTransactionNotCommited.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionNotCommited"},{"id":130,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBTransactionNotCommited.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionNotCommited"},{"id":131,"kind":128,"name":"ErrorDBTransactionRollbacked","url":"classes/errors.ErrorDBTransactionRollbacked.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"errors"},{"id":132,"kind":65536,"name":"__type","url":"classes/errors.ErrorDBTransactionRollbacked.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"errors.ErrorDBTransactionRollbacked"},{"id":133,"kind":512,"name":"constructor","url":"classes/errors.ErrorDBTransactionRollbacked.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionRollbacked"},{"id":134,"kind":1024,"name":"data","url":"classes/errors.ErrorDBTransactionRollbacked.html#data","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionRollbacked"},{"id":135,"kind":1024,"name":"cause","url":"classes/errors.ErrorDBTransactionRollbacked.html#cause","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"errors.ErrorDBTransactionRollbacked"},{"id":136,"kind":1,"name":"index","url":"modules/index.html","classes":"tsd-kind-module"},{"id":137,"kind":1,"name":"types","url":"modules/types.html","classes":"tsd-kind-module"},{"id":138,"kind":4194304,"name":"POJO","url":"modules/types.html#POJO","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":139,"kind":65536,"name":"__type","url":"modules/types.html#POJO.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"types.POJO"},{"id":140,"kind":256,"name":"FileSystem","url":"interfaces/types.FileSystem.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"types"},{"id":141,"kind":1024,"name":"promises","url":"interfaces/types.FileSystem.html#promises","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"types.FileSystem"},{"id":142,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-interface","parent":"types.FileSystem"},{"id":143,"kind":1024,"name":"rm","url":"interfaces/types.FileSystem.html#__type.rm","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":144,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":145,"kind":1024,"name":"mkdir","url":"interfaces/types.FileSystem.html#__type.mkdir","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":146,"kind":65536,"name":"__type","url":"interfaces/types.FileSystem.html#__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"types.FileSystem.__type"},{"id":147,"kind":4194304,"name":"Crypto","url":"modules/types.html#Crypto","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":148,"kind":65536,"name":"__type","url":"modules/types.html#Crypto.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"types.Crypto"},{"id":149,"kind":2048,"name":"encrypt","url":"modules/types.html#Crypto.__type.encrypt","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.Crypto.__type"},{"id":150,"kind":2048,"name":"decrypt","url":"modules/types.html#Crypto.__type.decrypt","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.Crypto.__type"},{"id":151,"kind":4194304,"name":"DBWorkerManagerInterface","url":"modules/types.html#DBWorkerManagerInterface","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":152,"kind":4194304,"name":"DBDomain","url":"modules/types.html#DBDomain","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":153,"kind":4194304,"name":"DBLevel","url":"modules/types.html#DBLevel","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":154,"kind":4194304,"name":"DBIterator","url":"modules/types.html#DBIterator","classes":"tsd-kind-type-alias tsd-parent-kind-module tsd-has-type-parameter","parent":"types"},{"id":155,"kind":65536,"name":"__type","url":"modules/types.html#DBIterator.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"types.DBIterator"},{"id":156,"kind":2048,"name":"seek","url":"modules/types.html#DBIterator.__type-1.seek","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.DBIterator.__type"},{"id":157,"kind":2048,"name":"next","url":"modules/types.html#DBIterator.__type-1.next","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.DBIterator.__type"},{"id":158,"kind":2048,"name":"end","url":"modules/types.html#DBIterator.__type-1.end","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.DBIterator.__type"},{"id":159,"kind":2048,"name":"[asyncIterator]","url":"modules/types.html#DBIterator.__type-1._asyncIterator_","classes":"tsd-kind-method tsd-parent-kind-type-literal","parent":"types.DBIterator.__type"},{"id":160,"kind":4194304,"name":"DBOp","url":"modules/types.html#DBOp","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":161,"kind":4194304,"name":"DBOps","url":"modules/types.html#DBOps","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"types"},{"id":162,"kind":1,"name":"utils","url":"modules/utils.html","classes":"tsd-kind-module"},{"id":163,"kind":32,"name":"prefix","url":"modules/utils.html#prefix","classes":"tsd-kind-variable tsd-parent-kind-module","parent":"utils"},{"id":164,"kind":64,"name":"domainPath","url":"modules/utils.html#domainPath","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":165,"kind":64,"name":"serialize","url":"modules/utils.html#serialize","classes":"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter","parent":"utils"},{"id":166,"kind":64,"name":"deserialize","url":"modules/utils.html#deserialize","classes":"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter","parent":"utils"},{"id":167,"kind":64,"name":"toArrayBuffer","url":"modules/utils.html#toArrayBuffer","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":168,"kind":64,"name":"fromArrayBuffer","url":"modules/utils.html#fromArrayBuffer","classes":"tsd-kind-function tsd-parent-kind-module","parent":"utils"},{"id":169,"kind":16777216,"name":"DB","url":"modules/index.html#DB","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":170,"kind":16777216,"name":"DBTransaction","url":"modules/index.html#DBTransaction","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":171,"kind":16777216,"name":"utils","url":"modules/index.html#utils","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":172,"kind":16777216,"name":"errors","url":"modules/index.html#errors","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":173,"kind":16777216,"name":"POJO","url":"modules/index.html#POJO","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":174,"kind":16777216,"name":"FileSystem","url":"modules/index.html#FileSystem","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":175,"kind":16777216,"name":"Crypto","url":"modules/index.html#Crypto","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":176,"kind":16777216,"name":"DBWorkerManagerInterface","url":"modules/index.html#DBWorkerManagerInterface","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":177,"kind":16777216,"name":"DBDomain","url":"modules/index.html#DBDomain","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":178,"kind":16777216,"name":"DBLevel","url":"modules/index.html#DBLevel","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":179,"kind":16777216,"name":"DBIterator","url":"modules/index.html#DBIterator","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":180,"kind":16777216,"name":"DBOp","url":"modules/index.html#DBOp","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"},{"id":181,"kind":16777216,"name":"DBOps","url":"modules/index.html#DBOps","classes":"tsd-kind-reference tsd-parent-kind-module","parent":"index"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,35.047]],["parent/0",[]],["name/1",[1,42.932]],["parent/1",[0,3.457]],["name/2",[2,48.04]],["parent/2",[3,1.617]],["name/3",[4,24.686]],["parent/3",[3,1.617]],["name/4",[5,48.04]],["parent/4",[3,1.617]],["name/5",[6,39.567]],["parent/5",[3,1.617]],["name/6",[7,21.891]],["parent/6",[3,1.617]],["name/7",[8,48.04]],["parent/7",[9,4.234]],["name/8",[10,42.932]],["parent/8",[9,4.234]],["name/9",[11,48.04]],["parent/9",[3,1.617]],["name/10",[12,42.932]],["parent/10",[3,1.617]],["name/11",[13,48.04]],["parent/11",[3,1.617]],["name/12",[14,48.04]],["parent/12",[3,1.617]],["name/13",[15,48.04]],["parent/13",[3,1.617]],["name/14",[16,48.04]],["parent/14",[3,1.617]],["name/15",[17,48.04]],["parent/15",[3,1.617]],["name/16",[0,35.047]],["parent/16",[3,1.617]],["name/17",[18,48.04]],["parent/17",[3,1.617]],["name/18",[19,48.04]],["parent/18",[3,1.617]],["name/19",[20,48.04]],["parent/19",[3,1.617]],["name/20",[21,48.04]],["parent/20",[3,1.617]],["name/21",[22,42.932]],["parent/21",[3,1.617]],["name/22",[23,48.04]],["parent/22",[3,1.617]],["name/23",[24,48.04]],["parent/23",[3,1.617]],["name/24",[25,48.04]],["parent/24",[3,1.617]],["name/25",[26,48.04]],["parent/25",[3,1.617]],["name/26",[27,42.932]],["parent/26",[3,1.617]],["name/27",[28,42.932]],["parent/27",[3,1.617]],["name/28",[29,42.932]],["parent/28",[3,1.617]],["name/29",[30,42.932]],["parent/29",[3,1.617]],["name/30",[31,42.932]],["parent/30",[3,1.617]],["name/31",[32,42.932]],["parent/31",[3,1.617]],["name/32",[33,42.932]],["parent/32",[3,1.617]],["name/33",[34,48.04]],["parent/33",[3,1.617]],["name/34",[35,48.04]],["parent/34",[3,1.617]],["name/35",[36,48.04]],["parent/35",[3,1.617]],["name/36",[37,48.04]],["parent/36",[3,1.617]],["name/37",[38,48.04]],["parent/37",[3,1.617]],["name/38",[39,48.04]],["parent/38",[3,1.617]],["name/39",[40,39.567]],["parent/39",[]],["name/40",[1,42.932]],["parent/40",[40,3.902]],["name/41",[41,48.04]],["parent/41",[42,1.8]],["name/42",[4,24.686]],["parent/42",[42,1.8]],["name/43",[43,48.04]],["parent/43",[42,1.8]],["name/44",[0,35.047]],["parent/44",[42,1.8]],["name/45",[44,48.04]],["parent/45",[42,1.8]],["name/46",[12,42.932]],["parent/46",[42,1.8]],["name/47",[45,48.04]],["parent/47",[42,1.8]],["name/48",[46,48.04]],["parent/48",[42,1.8]],["name/49",[47,48.04]],["parent/49",[42,1.8]],["name/50",[48,48.04]],["parent/50",[42,1.8]],["name/51",[49,48.04]],["parent/51",[42,1.8]],["name/52",[22,42.932]],["parent/52",[42,1.8]],["name/53",[10,42.932]],["parent/53",[42,1.8]],["name/54",[50,48.04]],["parent/54",[42,1.8]],["name/55",[51,48.04]],["parent/55",[42,1.8]],["name/56",[52,48.04]],["parent/56",[42,1.8]],["name/57",[53,48.04]],["parent/57",[42,1.8]],["name/58",[30,42.932]],["parent/58",[42,1.8]],["name/59",[27,42.932]],["parent/59",[42,1.8]],["name/60",[28,42.932]],["parent/60",[42,1.8]],["name/61",[29,42.932]],["parent/61",[42,1.8]],["name/62",[31,42.932]],["parent/62",[42,1.8]],["name/63",[32,42.932]],["parent/63",[42,1.8]],["name/64",[33,42.932]],["parent/64",[42,1.8]],["name/65",[54,48.04]],["parent/65",[42,1.8]],["name/66",[55,48.04]],["parent/66",[42,1.8]],["name/67",[56,48.04]],["parent/67",[42,1.8]],["name/68",[57,48.04]],["parent/68",[42,1.8]],["name/69",[58,48.04]],["parent/69",[42,1.8]],["name/70",[59,24.686]],["parent/70",[]],["name/71",[60,48.04]],["parent/71",[59,2.435]],["name/72",[7,21.891]],["parent/72",[61,3.654]],["name/73",[4,24.686]],["parent/73",[61,3.654]],["name/74",[62,26.068]],["parent/74",[61,3.654]],["name/75",[63,26.068]],["parent/75",[61,3.654]],["name/76",[64,48.04]],["parent/76",[59,2.435]],["name/77",[7,21.891]],["parent/77",[65,3.654]],["name/78",[4,24.686]],["parent/78",[65,3.654]],["name/79",[62,26.068]],["parent/79",[65,3.654]],["name/80",[63,26.068]],["parent/80",[65,3.654]],["name/81",[66,48.04]],["parent/81",[59,2.435]],["name/82",[7,21.891]],["parent/82",[67,3.654]],["name/83",[4,24.686]],["parent/83",[67,3.654]],["name/84",[62,26.068]],["parent/84",[67,3.654]],["name/85",[63,26.068]],["parent/85",[67,3.654]],["name/86",[68,48.04]],["parent/86",[59,2.435]],["name/87",[7,21.891]],["parent/87",[69,3.654]],["name/88",[4,24.686]],["parent/88",[69,3.654]],["name/89",[62,26.068]],["parent/89",[69,3.654]],["name/90",[63,26.068]],["parent/90",[69,3.654]],["name/91",[70,48.04]],["parent/91",[59,2.435]],["name/92",[7,21.891]],["parent/92",[71,3.654]],["name/93",[4,24.686]],["parent/93",[71,3.654]],["name/94",[62,26.068]],["parent/94",[71,3.654]],["name/95",[63,26.068]],["parent/95",[71,3.654]],["name/96",[72,48.04]],["parent/96",[59,2.435]],["name/97",[7,21.891]],["parent/97",[73,3.654]],["name/98",[4,24.686]],["parent/98",[73,3.654]],["name/99",[62,26.068]],["parent/99",[73,3.654]],["name/100",[63,26.068]],["parent/100",[73,3.654]],["name/101",[74,48.04]],["parent/101",[59,2.435]],["name/102",[7,21.891]],["parent/102",[75,3.654]],["name/103",[4,24.686]],["parent/103",[75,3.654]],["name/104",[62,26.068]],["parent/104",[75,3.654]],["name/105",[63,26.068]],["parent/105",[75,3.654]],["name/106",[76,48.04]],["parent/106",[59,2.435]],["name/107",[7,21.891]],["parent/107",[77,3.654]],["name/108",[4,24.686]],["parent/108",[77,3.654]],["name/109",[62,26.068]],["parent/109",[77,3.654]],["name/110",[63,26.068]],["parent/110",[77,3.654]],["name/111",[78,48.04]],["parent/111",[59,2.435]],["name/112",[7,21.891]],["parent/112",[79,3.654]],["name/113",[4,24.686]],["parent/113",[79,3.654]],["name/114",[62,26.068]],["parent/114",[79,3.654]],["name/115",[63,26.068]],["parent/115",[79,3.654]],["name/116",[80,48.04]],["parent/116",[59,2.435]],["name/117",[7,21.891]],["parent/117",[81,3.654]],["name/118",[4,24.686]],["parent/118",[81,3.654]],["name/119",[62,26.068]],["parent/119",[81,3.654]],["name/120",[63,26.068]],["parent/120",[81,3.654]],["name/121",[82,48.04]],["parent/121",[59,2.435]],["name/122",[7,21.891]],["parent/122",[83,3.654]],["name/123",[4,24.686]],["parent/123",[83,3.654]],["name/124",[62,26.068]],["parent/124",[83,3.654]],["name/125",[63,26.068]],["parent/125",[83,3.654]],["name/126",[84,48.04]],["parent/126",[59,2.435]],["name/127",[7,21.891]],["parent/127",[85,3.654]],["name/128",[4,24.686]],["parent/128",[85,3.654]],["name/129",[62,26.068]],["parent/129",[85,3.654]],["name/130",[63,26.068]],["parent/130",[85,3.654]],["name/131",[86,48.04]],["parent/131",[59,2.435]],["name/132",[7,21.891]],["parent/132",[87,3.654]],["name/133",[4,24.686]],["parent/133",[87,3.654]],["name/134",[62,26.068]],["parent/134",[87,3.654]],["name/135",[63,26.068]],["parent/135",[87,3.654]],["name/136",[88,25.353]],["parent/136",[]],["name/137",[89,28.581]],["parent/137",[]],["name/138",[90,42.932]],["parent/138",[89,2.819]],["name/139",[7,21.891]],["parent/139",[91,4.738]],["name/140",[92,42.932]],["parent/140",[89,2.819]],["name/141",[93,48.04]],["parent/141",[94,4.234]],["name/142",[7,21.891]],["parent/142",[94,4.234]],["name/143",[95,48.04]],["parent/143",[96,3.654]],["name/144",[7,21.891]],["parent/144",[96,3.654]],["name/145",[97,48.04]],["parent/145",[96,3.654]],["name/146",[7,21.891]],["parent/146",[96,3.654]],["name/147",[6,39.567]],["parent/147",[89,2.819]],["name/148",[7,21.891]],["parent/148",[98,4.738]],["name/149",[99,48.04]],["parent/149",[100,4.234]],["name/150",[101,48.04]],["parent/150",[100,4.234]],["name/151",[102,42.932]],["parent/151",[89,2.819]],["name/152",[103,42.932]],["parent/152",[89,2.819]],["name/153",[104,42.932]],["parent/153",[89,2.819]],["name/154",[105,42.932]],["parent/154",[89,2.819]],["name/155",[7,21.891]],["parent/155",[106,4.738]],["name/156",[107,48.04]],["parent/156",[108,3.654]],["name/157",[109,48.04]],["parent/157",[108,3.654]],["name/158",[110,48.04]],["parent/158",[108,3.654]],["name/159",[111,48.04]],["parent/159",[108,3.654]],["name/160",[112,42.932]],["parent/160",[89,2.819]],["name/161",[113,42.932]],["parent/161",[89,2.819]],["name/162",[114,30.694]],["parent/162",[]],["name/163",[115,48.04]],["parent/163",[114,3.027]],["name/164",[116,48.04]],["parent/164",[114,3.027]],["name/165",[117,48.04]],["parent/165",[114,3.027]],["name/166",[118,48.04]],["parent/166",[114,3.027]],["name/167",[119,48.04]],["parent/167",[114,3.027]],["name/168",[120,48.04]],["parent/168",[114,3.027]],["name/169",[0,35.047]],["parent/169",[88,2.5]],["name/170",[40,39.567]],["parent/170",[88,2.5]],["name/171",[114,30.694]],["parent/171",[88,2.5]],["name/172",[59,24.686]],["parent/172",[88,2.5]],["name/173",[90,42.932]],["parent/173",[88,2.5]],["name/174",[92,42.932]],["parent/174",[88,2.5]],["name/175",[6,39.567]],["parent/175",[88,2.5]],["name/176",[102,42.932]],["parent/176",[88,2.5]],["name/177",[103,42.932]],["parent/177",[88,2.5]],["name/178",[104,42.932]],["parent/178",[88,2.5]],["name/179",[105,42.932]],["parent/179",[88,2.5]],["name/180",[112,42.932]],["parent/180",[88,2.5]],["name/181",[113,42.932]],["parent/181",[88,2.5]]],"invertedIndex":[["__type",{"_index":7,"name":{"6":{},"72":{},"77":{},"82":{},"87":{},"92":{},"97":{},"102":{},"107":{},"112":{},"117":{},"122":{},"127":{},"132":{},"139":{},"142":{},"144":{},"146":{},"148":{},"155":{}},"parent":{}}],["_callbacksfailure",{"_index":47,"name":{"49":{}},"parent":{}}],["_callbackssuccess",{"_index":46,"name":{"48":{}},"parent":{}}],["_committed",{"_index":48,"name":{"50":{}},"parent":{}}],["_datadb",{"_index":15,"name":{"13":{}},"parent":{}}],["_db",{"_index":14,"name":{"12":{}},"parent":{}}],["_level",{"_index":39,"name":{"38":{}},"parent":{}}],["_ops",{"_index":45,"name":{"47":{}},"parent":{}}],["_rollbacked",{"_index":49,"name":{"51":{}},"parent":{}}],["_transactionsdb",{"_index":16,"name":{"14":{}},"parent":{}}],["asynciterator",{"_index":111,"name":{"159":{}},"parent":{}}],["batch",{"_index":34,"name":{"33":{}},"parent":{}}],["callbacksfailure",{"_index":51,"name":{"55":{}},"parent":{}}],["callbackssuccess",{"_index":50,"name":{"54":{}},"parent":{}}],["cause",{"_index":63,"name":{"75":{},"80":{},"85":{},"90":{},"95":{},"100":{},"105":{},"110":{},"115":{},"120":{},"125":{},"130":{},"135":{}},"parent":{}}],["clear",{"_index":28,"name":{"27":{},"60":{}},"parent":{}}],["commit",{"_index":56,"name":{"67":{}},"parent":{}}],["committed",{"_index":52,"name":{"56":{}},"parent":{}}],["constructor",{"_index":4,"name":{"3":{},"42":{},"73":{},"78":{},"83":{},"88":{},"93":{},"98":{},"103":{},"108":{},"113":{},"118":{},"123":{},"128":{},"133":{}},"parent":{}}],["count",{"_index":29,"name":{"28":{},"61":{}},"parent":{}}],["createdb",{"_index":2,"name":{"2":{}},"parent":{}}],["createtransaction",{"_index":41,"name":{"41":{}},"parent":{}}],["crypto",{"_index":6,"name":{"5":{},"147":{},"175":{}},"parent":{}}],["data",{"_index":62,"name":{"74":{},"79":{},"84":{},"89":{},"94":{},"99":{},"104":{},"109":{},"114":{},"119":{},"124":{},"129":{},"134":{}},"parent":{}}],["datadb",{"_index":18,"name":{"17":{}},"parent":{}}],["db",{"_index":0,"name":{"0":{},"16":{},"44":{},"169":{}},"parent":{"1":{}}}],["db.default",{"_index":3,"name":{},"parent":{"2":{},"3":{},"4":{},"5":{},"6":{},"9":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{}}}],["db.default.__type",{"_index":9,"name":{},"parent":{"7":{},"8":{}}}],["dbdomain",{"_index":103,"name":{"152":{},"177":{}},"parent":{}}],["dbiterator",{"_index":105,"name":{"154":{},"179":{}},"parent":{}}],["dblevel",{"_index":104,"name":{"153":{},"178":{}},"parent":{}}],["dbop",{"_index":112,"name":{"160":{},"180":{}},"parent":{}}],["dbops",{"_index":113,"name":{"161":{},"181":{}},"parent":{}}],["dbpath",{"_index":5,"name":{"4":{}},"parent":{}}],["dbtransaction",{"_index":40,"name":{"39":{},"170":{}},"parent":{"40":{}}}],["dbtransaction.default",{"_index":42,"name":{},"parent":{"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{},"48":{},"49":{},"50":{},"51":{},"52":{},"53":{},"54":{},"55":{},"56":{},"57":{},"58":{},"59":{},"60":{},"61":{},"62":{},"63":{},"64":{},"65":{},"66":{},"67":{},"68":{},"69":{}}}],["dbworkermanagerinterface",{"_index":102,"name":{"151":{},"176":{}},"parent":{}}],["decrypt",{"_index":101,"name":{"150":{}},"parent":{}}],["default",{"_index":1,"name":{"1":{},"40":{}},"parent":{}}],["del",{"_index":33,"name":{"32":{},"64":{}},"parent":{}}],["deserialize",{"_index":118,"name":{"166":{}},"parent":{}}],["deserializedecrypt",{"_index":36,"name":{"35":{}},"parent":{}}],["destroy",{"_index":22,"name":{"21":{},"52":{}},"parent":{}}],["domainpath",{"_index":116,"name":{"164":{}},"parent":{}}],["dump",{"_index":30,"name":{"29":{},"58":{}},"parent":{}}],["encrypt",{"_index":99,"name":{"149":{}},"parent":{}}],["end",{"_index":110,"name":{"158":{}},"parent":{}}],["errordb",{"_index":60,"name":{"71":{}},"parent":{}}],["errordbcreate",{"_index":70,"name":{"91":{}},"parent":{}}],["errordbdecrypt",{"_index":76,"name":{"106":{}},"parent":{}}],["errordbdelete",{"_index":72,"name":{"96":{}},"parent":{}}],["errordbdestroyed",{"_index":68,"name":{"86":{}},"parent":{}}],["errordblevelprefix",{"_index":74,"name":{"101":{}},"parent":{}}],["errordbnotrunning",{"_index":66,"name":{"81":{}},"parent":{}}],["errordbparse",{"_index":78,"name":{"111":{}},"parent":{}}],["errordbrunning",{"_index":64,"name":{"76":{}},"parent":{}}],["errordbtransactioncommitted",{"_index":82,"name":{"121":{}},"parent":{}}],["errordbtransactiondestroyed",{"_index":80,"name":{"116":{}},"parent":{}}],["errordbtransactionnotcommited",{"_index":84,"name":{"126":{}},"parent":{}}],["errordbtransactionrollbacked",{"_index":86,"name":{"131":{}},"parent":{}}],["errors",{"_index":59,"name":{"70":{},"172":{}},"parent":{"71":{},"76":{},"81":{},"86":{},"91":{},"96":{},"101":{},"106":{},"111":{},"116":{},"121":{},"126":{},"131":{}}}],["errors.errordb",{"_index":61,"name":{},"parent":{"72":{},"73":{},"74":{},"75":{}}}],["errors.errordbcreate",{"_index":71,"name":{},"parent":{"92":{},"93":{},"94":{},"95":{}}}],["errors.errordbdecrypt",{"_index":77,"name":{},"parent":{"107":{},"108":{},"109":{},"110":{}}}],["errors.errordbdelete",{"_index":73,"name":{},"parent":{"97":{},"98":{},"99":{},"100":{}}}],["errors.errordbdestroyed",{"_index":69,"name":{},"parent":{"87":{},"88":{},"89":{},"90":{}}}],["errors.errordblevelprefix",{"_index":75,"name":{},"parent":{"102":{},"103":{},"104":{},"105":{}}}],["errors.errordbnotrunning",{"_index":67,"name":{},"parent":{"82":{},"83":{},"84":{},"85":{}}}],["errors.errordbparse",{"_index":79,"name":{},"parent":{"112":{},"113":{},"114":{},"115":{}}}],["errors.errordbrunning",{"_index":65,"name":{},"parent":{"77":{},"78":{},"79":{},"80":{}}}],["errors.errordbtransactioncommitted",{"_index":83,"name":{},"parent":{"122":{},"123":{},"124":{},"125":{}}}],["errors.errordbtransactiondestroyed",{"_index":81,"name":{},"parent":{"117":{},"118":{},"119":{},"120":{}}}],["errors.errordbtransactionnotcommited",{"_index":85,"name":{},"parent":{"127":{},"128":{},"129":{},"130":{}}}],["errors.errordbtransactionrollbacked",{"_index":87,"name":{},"parent":{"132":{},"133":{},"134":{},"135":{}}}],["filesystem",{"_index":92,"name":{"140":{},"174":{}},"parent":{}}],["finalize",{"_index":58,"name":{"69":{}},"parent":{}}],["fromarraybuffer",{"_index":120,"name":{"168":{}},"parent":{}}],["fs",{"_index":11,"name":{"9":{}},"parent":{}}],["get",{"_index":31,"name":{"30":{},"62":{}},"parent":{}}],["index",{"_index":88,"name":{"136":{}},"parent":{"169":{},"170":{},"171":{},"172":{},"173":{},"174":{},"175":{},"176":{},"177":{},"178":{},"179":{},"180":{},"181":{}}}],["iterator",{"_index":27,"name":{"26":{},"59":{}},"parent":{}}],["key",{"_index":8,"name":{"7":{}},"parent":{}}],["level",{"_index":26,"name":{"25":{}},"parent":{}}],["logger",{"_index":12,"name":{"10":{},"46":{}},"parent":{}}],["mkdir",{"_index":97,"name":{"145":{}},"parent":{}}],["next",{"_index":109,"name":{"157":{}},"parent":{}}],["ops",{"_index":10,"name":{"8":{},"53":{}},"parent":{}}],["pojo",{"_index":90,"name":{"138":{},"173":{}},"parent":{}}],["prefix",{"_index":115,"name":{"163":{}},"parent":{}}],["promises",{"_index":93,"name":{"141":{}},"parent":{}}],["put",{"_index":32,"name":{"31":{},"63":{}},"parent":{}}],["queuefailure",{"_index":55,"name":{"66":{}},"parent":{}}],["queuesuccess",{"_index":54,"name":{"65":{}},"parent":{}}],["rm",{"_index":95,"name":{"143":{}},"parent":{}}],["rollback",{"_index":57,"name":{"68":{}},"parent":{}}],["rollbacked",{"_index":53,"name":{"57":{}},"parent":{}}],["seek",{"_index":107,"name":{"156":{}},"parent":{}}],["serialize",{"_index":117,"name":{"165":{}},"parent":{}}],["serializeencrypt",{"_index":35,"name":{"34":{}},"parent":{}}],["setupdb",{"_index":37,"name":{"36":{}},"parent":{}}],["setuprootlevels",{"_index":38,"name":{"37":{}},"parent":{}}],["setworkermanager",{"_index":23,"name":{"22":{}},"parent":{}}],["start",{"_index":20,"name":{"19":{}},"parent":{}}],["stop",{"_index":21,"name":{"20":{}},"parent":{}}],["toarraybuffer",{"_index":119,"name":{"167":{}},"parent":{}}],["transaction",{"_index":25,"name":{"24":{}},"parent":{}}],["transactioncounter",{"_index":17,"name":{"15":{}},"parent":{}}],["transactiondb",{"_index":44,"name":{"45":{}},"parent":{}}],["transactionid",{"_index":43,"name":{"43":{}},"parent":{}}],["transactionsdb",{"_index":19,"name":{"18":{}},"parent":{}}],["types",{"_index":89,"name":{"137":{}},"parent":{"138":{},"140":{},"147":{},"151":{},"152":{},"153":{},"154":{},"160":{},"161":{}}}],["types.crypto",{"_index":98,"name":{},"parent":{"148":{}}}],["types.crypto.__type",{"_index":100,"name":{},"parent":{"149":{},"150":{}}}],["types.dbiterator",{"_index":106,"name":{},"parent":{"155":{}}}],["types.dbiterator.__type",{"_index":108,"name":{},"parent":{"156":{},"157":{},"158":{},"159":{}}}],["types.filesystem",{"_index":94,"name":{},"parent":{"141":{},"142":{}}}],["types.filesystem.__type",{"_index":96,"name":{},"parent":{"143":{},"144":{},"145":{},"146":{}}}],["types.pojo",{"_index":91,"name":{},"parent":{"139":{}}}],["unsetworkermanager",{"_index":24,"name":{"23":{}},"parent":{}}],["utils",{"_index":114,"name":{"162":{},"171":{}},"parent":{"163":{},"164":{},"165":{},"166":{},"167":{},"168":{}}}],["workermanager",{"_index":13,"name":{"11":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/classes/DB.default.html b/docs/classes/DB.default.html index 49e0461e..3f19bce1 100644 --- a/docs/classes/DB.default.html +++ b/docs/classes/DB.default.html @@ -95,12 +95,14 @@

Constructors

Properties

@@ -110,28 +112,34 @@

Accessors

  • [destroyed]
  • [running]
  • [status]
  • +
  • dataDb
  • db
  • -
  • locked
  • +
  • transactionsDb
  • Methods

    @@ -144,20 +152,20 @@

    Constructors

    constructor

    +
    + +

    dump

    + + +

    get

    @@ -526,7 +640,7 @@

    get

  • Type parameters

    @@ -552,7 +666,7 @@

    Returns Promise

    Parameters

    @@ -571,6 +685,86 @@

    Returns Promise

  • +
    + +

    iterator

    + + +

    level

    @@ -581,7 +775,7 @@

    level

  • Parameters

    @@ -608,7 +802,7 @@

    put

  • Parameters

    @@ -631,7 +825,7 @@

    Returns Promise

    Parameters

    @@ -664,7 +858,7 @@

    serializeEncrypt

  • Parameters

    @@ -681,7 +875,7 @@

    Returns Promise

    Parameters

    @@ -707,7 +901,7 @@

    setWorkerManager

  • Parameters

    @@ -720,6 +914,52 @@

    Returns void

  • +
    + +

    Protected setupDb

    + + +
    +
    + +

    Protected setupRootLevels

    + + +

    start

    @@ -731,7 +971,7 @@

    start

    Parameters

    @@ -760,70 +1000,27 @@

    stop

    Returns Promise<void>

    -
    - -

    transact

    -
    -
    - -

    withLocks

    - - -

    Static createDB

    @@ -259,13 +260,67 @@

    Protected logger

    logger: Logger
    + +
    + +

    Protected transactionDb

    +
    transactionDb: DBLevel
    + +
    +
    + +

    Readonly transactionId

    +
    transactionId: number
    +

    Accessors

    +
    + +

    [destroyed]

    +
      +
    • get [destroyed](): boolean
    • +
    +
      +
    • + +

      Returns boolean

      +
    • +
    +
    +
    + +

    [status]

    +
      +
    • get [status](): Status
    • +
    +
      +
    • + +

      Returns Status

      +
    • +
    +

    callbacksFailure

    @@ -275,9 +330,8 @@

    callbacksFailure

    -
    - -

    snap

    -
      -
    • get snap(): ReadonlyMap<string, any>
    • +
    +
    +

    Methods

    +
    + +

    clear

    +
      +
    • clear(domain?: readonly string[]): Promise<void>
    -
    -
    -

    Methods

    commit

    @@ -386,13 +442,36 @@

    commit

  • Returns Promise<void>

  • +
    + +

    count

    +
      +
    • count(domain?: readonly string[]): Promise<number>
    • +
    +
      +
    • + +

      Parameters

      +
        +
      • +
        domain: readonly string[] = []
        +
      • +
      +

      Returns Promise<number>

      +
    • +
    +

    del

    @@ -402,9 +481,8 @@

    del

    +
    + +

    destroy

    +
      +
    • destroy(): Promise<void>
    • +
    +
      +
    • + +

      Returns Promise<void>

      +
    • +
    +
    +
    + +

    dump

    +
      +
    • dump(domain?: readonly string[]): Promise<POJO>
    • +
    + +

    finalize

    @@ -430,7 +549,7 @@

    finalize

  • Returns Promise<void>

    @@ -447,9 +566,8 @@

    get

  • +
    + +

    iterator

    +
      +
    • iterator(options: AbstractIteratorOptions<any> & { values: false }, domain?: readonly string[]): Promise<DBIterator<Buffer, undefined>>
    • +
    • iterator(options?: AbstractIteratorOptions<any>, domain?: readonly string[]): Promise<DBIterator<Buffer, Buffer>>
    • +
    +
      +
    • + +

      Parameters

      +
        +
      • +
        options: AbstractIteratorOptions<any> & { values: false }
        +
      • +
      • +
        Optional domain: readonly string[]
        +
      • +
      +

      Returns Promise<DBIterator<Buffer, undefined>>

      +
    • +
    • + +

      Parameters

      +
        +
      • +
        Optional options: AbstractIteratorOptions<any>
        +
      • +
      • +
        Optional domain: readonly string[]
        +
      • +
      +

      Returns Promise<DBIterator<Buffer, Buffer>>

      +
    • +
    +

    put

    @@ -505,9 +666,8 @@

    put

    +
    + +

    Static createTransaction

    +
      +
    • createTransaction(__namedParameters: { db: default; logger?: Logger; transactionDb: DBLevel; transactionId: number }): Promise<default>
    • +
    +
      +
    • + +

      Parameters

      +
        +
      • +
        __namedParameters: { db: default; logger?: Logger; transactionDb: DBLevel; transactionId: number }
        +
          +
        • +
          db: default
          +
        • +
        • +
          Optional logger?: Logger
          +
        • +
        • +
          transactionDb: DBLevel
          +
        • +
        • +
          transactionId: number
          +
        • +
        +
      • +
      +

      Returns Promise<default>

      +
    • +
    +
    diff --git a/docs/classes/errors.ErrorDB.html b/docs/classes/errors.ErrorDB.html index 07eecf05..a0f808f3 100644 --- a/docs/classes/errors.ErrorDB.html +++ b/docs/classes/errors.ErrorDB.html @@ -102,13 +102,16 @@

    Hierarchy

    ErrorDBParse
  • - ErrorDBCommitted + ErrorDBTransactionDestroyed
  • - ErrorDBNotCommited + ErrorDBTransactionCommitted
  • - ErrorDBRollbacked + ErrorDBTransactionNotCommited +
  • +
  • + ErrorDBTransactionRollbacked
  • @@ -333,7 +336,7 @@

    Returns voidDB
  • - Transaction + DBTransaction
  • errors @@ -387,9 +390,6 @@

    Returns void @@ -434,6 +440,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Class
    • diff --git a/docs/classes/errors.ErrorDBCreate.html b/docs/classes/errors.ErrorDBCreate.html index b7060db8..d8820c27 100644 --- a/docs/classes/errors.ErrorDBCreate.html +++ b/docs/classes/errors.ErrorDBCreate.html @@ -300,7 +300,7 @@

      Returns voidDB
    • - Transaction + DBTransaction
    • errors @@ -321,9 +321,6 @@

      Returns void ErrorDB

    • -
    • - ErrorDBCommitted -
    @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Inherited constructor
    • diff --git a/docs/classes/errors.ErrorDBLevelPrefix.html b/docs/classes/errors.ErrorDBLevelPrefix.html index 06311846..de557b97 100644 --- a/docs/classes/errors.ErrorDBLevelPrefix.html +++ b/docs/classes/errors.ErrorDBLevelPrefix.html @@ -300,7 +300,7 @@

      Returns voidDB
    • - Transaction + DBTransaction
    • errors @@ -321,9 +321,6 @@

      Returns void ErrorDB

    • -
    • - ErrorDBCommitted -
    • ErrorDBCreate
    • @@ -372,9 +369,6 @@

      Returns void

    @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • @@ -387,6 +378,18 @@

      Returns void

    @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Inherited constructor
    • diff --git a/docs/classes/errors.ErrorDBCommitted.html b/docs/classes/errors.ErrorDBTransactionCommitted.html similarity index 83% rename from docs/classes/errors.ErrorDBCommitted.html rename to docs/classes/errors.ErrorDBTransactionCommitted.html index 9169fb06..ce7e0511 100644 --- a/docs/classes/errors.ErrorDBCommitted.html +++ b/docs/classes/errors.ErrorDBTransactionCommitted.html @@ -3,7 +3,7 @@ - ErrorDBCommitted | @matrixai/db + ErrorDBTransactionCommitted | @matrixai/db @@ -58,10 +58,10 @@ errors
    • - ErrorDBCommitted + ErrorDBTransactionCommitted
    -

    Class ErrorDBCommitted

    +

    Class ErrorDBTransactionCommitted

    @@ -75,7 +75,7 @@

    Hierarchy

    ErrorDB
    • - ErrorDBCommitted + ErrorDBTransactionCommitted

  • @@ -88,25 +88,25 @@

    Index

    Constructors

    Properties

    Methods

    @@ -118,7 +118,7 @@

    Constructors

    constructor

    -

    Returns ErrorDBCommitted

    +

    Returns ErrorDBTransactionCommitted

    @@ -300,7 +300,7 @@

    Returns voidDB
  • - Transaction + DBTransaction
  • errors @@ -321,71 +321,74 @@

    Returns void ErrorDB

  • +
  • + ErrorDBCreate +
  • +
  • + ErrorDBDecrypt +
  • +
  • + ErrorDBDelete +
  • +
  • + ErrorDBDestroyed +
  • +
  • + ErrorDBLevelPrefix +
  • +
  • + ErrorDBNotRunning +
  • +
  • + ErrorDBParse +
  • +
  • + ErrorDBRunning +
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Inherited constructor
    • diff --git a/docs/classes/errors.ErrorDBNotCommited.html b/docs/classes/errors.ErrorDBTransactionDestroyed.html similarity index 83% rename from docs/classes/errors.ErrorDBNotCommited.html rename to docs/classes/errors.ErrorDBTransactionDestroyed.html index b5971e8e..020ee0e9 100644 --- a/docs/classes/errors.ErrorDBNotCommited.html +++ b/docs/classes/errors.ErrorDBTransactionDestroyed.html @@ -3,7 +3,7 @@ - ErrorDBNotCommited | @matrixai/db + ErrorDBTransactionDestroyed | @matrixai/db @@ -58,10 +58,10 @@ errors
    • - ErrorDBNotCommited + ErrorDBTransactionDestroyed
    -

    Class ErrorDBNotCommited

    +

    Class ErrorDBTransactionDestroyed

    @@ -75,7 +75,7 @@

    Hierarchy

    ErrorDB
    • - ErrorDBNotCommited + ErrorDBTransactionDestroyed
    @@ -88,25 +88,25 @@

    Index

    Constructors

    Properties

    Methods

    @@ -118,7 +118,7 @@

    Constructors

    constructor

    -

    Returns ErrorDBNotCommited

    +

    Returns ErrorDBTransactionDestroyed

    @@ -300,7 +300,7 @@

    Returns voidDB
  • - Transaction + DBTransaction
  • errors @@ -321,9 +321,6 @@

    Returns void ErrorDB

  • -
  • - ErrorDBCommitted -
  • ErrorDBCreate
  • @@ -339,53 +336,59 @@

    Returns void ErrorDBLevelPrefix +
  • + ErrorDBNotRunning +
  • +
  • + ErrorDBParse +
  • +
  • + ErrorDBRunning +
  • +
  • + ErrorDBTransactionCommitted +
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Inherited constructor
    • diff --git a/docs/classes/errors.ErrorDBTransactionNotCommited.html b/docs/classes/errors.ErrorDBTransactionNotCommited.html new file mode 100644 index 00000000..c9b279ba --- /dev/null +++ b/docs/classes/errors.ErrorDBTransactionNotCommited.html @@ -0,0 +1,428 @@ + + + + + + ErrorDBTransactionNotCommited | @matrixai/db + + + + + + +
      +
      +
      +
      + +
      +
      + Options +
      +
      + All +
        +
      • Public
      • +
      • Public/Protected
      • +
      • All
      • +
      +
      + + + + +
      +
      + Menu +
      +
      +
      +
      +
      +
      + +

      Class ErrorDBTransactionNotCommited

      +
      +
      +
      +
      +
      +
      +
      +

      Hierarchy

      +
        +
      • + ErrorDB +
          +
        • + ErrorDBTransactionNotCommited +
        • +
        +
      • +
      +
      +
      +

      Index

      +
      +
      +
      +

      Constructors

      + +
      +
      +

      Properties

      + +
      +
      +

      Methods

      + +
      +
      +
      +
      +
      +

      Constructors

      +
      + +

      constructor

      + + +
      +
      +
      +

      Properties

      +
      + +

      Optional cause

      +
      cause: ErrorChain
      + +
      +
      + +

      data

      +
      data: POJO
      + +
      +
      + +

      message

      +
      message: string
      + +
      +
      + +

      name

      +
      name: string
      + +
      +
      + +

      Optional stack

      +
      stack: string
      + +
      +
      + +

      Static Optional prepareStackTrace

      +
      prepareStackTrace: (err: Error, stackTraces: CallSite[]) => any
      + +
      +

      Type declaration

      +
        +
      • +
          +
        • (err: Error, stackTraces: CallSite[]): any
        • +
        +
          +
        • +
          +
          +

          Optional override for formatting stack traces

          +
          +
          +

          Parameters

          +
            +
          • +
            err: Error
            +
          • +
          • +
            stackTraces: CallSite[]
            +
          • +
          +

          Returns any

          +
        • +
        +
      • +
      +
      +
      +
      + +

      Static stackTraceLimit

      +
      stackTraceLimit: number
      + +
      +
      +
      +

      Methods

      +
      + +

      Static captureStackTrace

      +
        +
      • captureStackTrace(targetObject: object, constructorOpt?: Function): void
      • +
      +
        +
      • + +
        +
        +

        Create .stack property on a target object

        +
        +
        +

        Parameters

        +
          +
        • +
          targetObject: object
          +
        • +
        • +
          Optional constructorOpt: Function
          +
        • +
        +

        Returns void

        +
      • +
      +
      +
      +
      + +
      +
      +
      +
      +

      Legend

      +
      +
        +
      • Variable
      • +
      • Function
      • +
      • Function with type parameter
      • +
      • Type alias
      • +
      • Type alias with type parameter
      • +
      +
        +
      • Inherited constructor
      • +
      • Inherited property
      • +
      +
        +
      • Interface
      • +
      +
        +
      • Class
      • +
      +
      +
      +
      +
      +

      Generated using TypeDoc

      +
      +
      + + + \ No newline at end of file diff --git a/docs/classes/errors.ErrorDBRollbacked.html b/docs/classes/errors.ErrorDBTransactionRollbacked.html similarity index 83% rename from docs/classes/errors.ErrorDBRollbacked.html rename to docs/classes/errors.ErrorDBTransactionRollbacked.html index c4954fbe..95bd53e2 100644 --- a/docs/classes/errors.ErrorDBRollbacked.html +++ b/docs/classes/errors.ErrorDBTransactionRollbacked.html @@ -3,7 +3,7 @@ - ErrorDBRollbacked | @matrixai/db + ErrorDBTransactionRollbacked | @matrixai/db @@ -58,10 +58,10 @@ errors
    • - ErrorDBRollbacked + ErrorDBTransactionRollbacked
    -

    Class ErrorDBRollbacked

    +

    Class ErrorDBTransactionRollbacked

    @@ -75,7 +75,7 @@

    Hierarchy

    ErrorDB
    • - ErrorDBRollbacked + ErrorDBTransactionRollbacked
    @@ -88,25 +88,25 @@

    Index

    Constructors

    Properties

    Methods

    @@ -118,7 +118,7 @@

    Constructors

    constructor

    -

    Returns ErrorDBRollbacked

    +

    Returns ErrorDBTransactionRollbacked

    @@ -300,7 +300,7 @@

    Returns voidDB
  • - Transaction + DBTransaction
  • errors @@ -321,9 +321,6 @@

    Returns void ErrorDB

  • -
  • - ErrorDBCommitted -
  • ErrorDBCreate
  • @@ -339,54 +336,60 @@

    Returns void ErrorDBLevelPrefix -
  • - ErrorDBNotCommited -
  • ErrorDBNotRunning
  • ErrorDBParse
  • +
  • + ErrorDBRunning +
  • +
  • + ErrorDBTransactionCommitted +
  • +
  • + ErrorDBTransactionDestroyed +
  • +
  • + ErrorDBTransactionNotCommited +
  • @@ -401,6 +404,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Inherited constructor
    • diff --git a/docs/index.html b/docs/index.html index 8bf7ea5b..35f97d7c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -119,7 +119,7 @@

      Publishing

      DB
    • - Transaction + DBTransaction
    • errors @@ -151,6 +151,7 @@

      Legend

    • Function
    • Function with type parameter
    • Type alias
    • +
    • Type alias with type parameter
    @@ -107,6 +107,11 @@

    DB

    DBDomain

    Re-exports DBDomain +
    + +

    DBIterator

    + Re-exports DBIterator +

    DBLevel

    @@ -125,7 +130,7 @@

    DBOps

    DBTransaction

    - Re-exports DBTransaction + Renames and exports default
    @@ -142,11 +147,6 @@

    FileSystem

    POJO

    Re-exports POJO
    -
    - -

    Transaction

    - Renames and exports default -

    errors

    @@ -169,7 +169,7 @@

    utils

    DB
  • - Transaction + DBTransaction
  • errors @@ -196,6 +196,9 @@

    utils

  • DBDomain
  • +
  • + DBIterator +
  • DBLevel
  • @@ -217,9 +220,6 @@

    utils

  • POJO
  • -
  • - Transaction -
  • errors
  • @@ -240,6 +240,7 @@

    Legend

  • Function
  • Function with type parameter
  • Type alias
  • +
  • Type alias with type parameter
    • Interface
    • diff --git a/docs/modules/types.html b/docs/modules/types.html index bcee0dc8..9b99cc0c 100644 --- a/docs/modules/types.html +++ b/docs/modules/types.html @@ -72,7 +72,6 @@

      Index

      Interfaces

      @@ -81,6 +80,7 @@

      Type aliases

    +
    + +

    DBIterator

    +
    DBIterator<K, V>: { [asyncIterator]: any; end: any; next: any; seek: any }
    + +
    +
    +

    Custom type for our iterator + This takes over from the outdated AbstractIterator used in abstract-leveldown

    +
    +
    +

    Type parameters

    +
      +
    • +

      K = Buffer | undefined

      +
    • +
    • +

      V = Buffer | undefined

      +
    • +
    +
    +

    Type declaration

    +
      +
    • +
      [asyncIterator]: function
      +
        +
      • [asyncIterator](): AsyncGenerator<[K, V], any, unknown>
      • +
      +
        +
      • + +

        Returns AsyncGenerator<[K, V], any, unknown>

        +
      • +
      +
    • +
    • +
      end: function
      +
        +
      • end(): Promise<void>
      • +
      + +
    • +
    • +
      next: function
      +
        +
      • next(): Promise<undefined | [K, V]>
      • +
      +
        +
      • + +

        Returns Promise<undefined | [K, V]>

        +
      • +
      +
    • +
    • +
      seek: function
      +
        +
      • seek(k: string | Buffer): void
      • +
      +
        +
      • + +

        Parameters

        +
          +
        • +
          k: string | Buffer
          +
        • +
        +

        Returns void

        +
      • +
      +
    • +
    +
    +

    DBLevel

    @@ -190,7 +290,7 @@

    DBOp

    DBOp: ({ type: "put" } & DBOp_) | ({ type: "del" } & Omit<DBOp_, "value" | "raw">)
    @@ -200,7 +300,7 @@

    DBOps

    DBOps: DBOp[]
    @@ -249,7 +349,7 @@
    [key: DB
  • - Transaction + DBTransaction
  • errors @@ -267,9 +367,6 @@
    [key:
    • Interface
    • diff --git a/package-lock.json b/package-lock.json index 043f1730..a5c525a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -832,6 +832,11 @@ "resolved": "https://registry.npmjs.org/@matrixai/logger/-/logger-2.1.0.tgz", "integrity": "sha512-UmLuXi2PJ03v0Scfl57217RPnjEZDRLlpfdIjIwCfju+kofnhhCI9P7OZu3/FgW147vbvSzWCrrtpwJiLROUUA==" }, + "@matrixai/resources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@matrixai/resources/-/resources-1.0.0.tgz", + "integrity": "sha512-B1ZkySZwOZTIzhK+YTN4HifOTd1dk1ifDUV8/8WgGho2nUZzIMYms7iDmW/ZHUCkqvWupKY6AYvfwnKBOJJnWg==" + }, "@matrixai/workers": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@matrixai/workers/-/workers-1.2.5.tgz", diff --git a/package.json b/package.json index a467b760..f50d3e01 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "dependencies": { "@matrixai/async-init": "^1.6.0", "@matrixai/logger": "^2.1.0", + "@matrixai/resources": "^1.0.0", "@matrixai/workers": "^1.2.5", "abstract-leveldown": "^7.2.0", - "async-mutex": "^0.3.1", "level": "7.0.1", "levelup": "^5.1.1", "sublevel-prefixer": "^1.0.0", diff --git a/shell.nix b/shell.nix index c38baebf..223d81c3 100644 --- a/shell.nix +++ b/shell.nix @@ -13,6 +13,9 @@ pkgs.mkShell { set +o allexport set -v + # Enables npm link to work + export npm_config_prefix=~/.npm + export PATH="$(pwd)/dist/bin:$(npm bin):$PATH" npm install mkdir --parents "$(pwd)/tmp" diff --git a/src/DB.ts b/src/DB.ts index c38472a9..8dd41a93 100644 --- a/src/DB.ts +++ b/src/DB.ts @@ -1,26 +1,28 @@ -import type { AbstractBatch } from 'abstract-leveldown'; +import type { + AbstractBatch, + AbstractIteratorOptions, +} from 'abstract-leveldown'; import type { LevelDB } from 'level'; -import type { MutexInterface } from 'async-mutex'; +import type { ResourceAcquire } from '@matrixai/resources'; import type { + POJO, FileSystem, Crypto, DBWorkerManagerInterface, DBDomain, DBLevel, + DBIterator, DBOps, - DBTransaction, } from './types'; - import level from 'level'; import subleveldown from 'subleveldown'; import { Transfer } from 'threads'; -import { Mutex } from 'async-mutex'; import Logger from '@matrixai/logger'; import { CreateDestroyStartStop, ready, } from '@matrixai/async-init/dist/CreateDestroyStartStop'; -import Transaction from './Transaction'; +import DBTransaction from './DBTransaction'; import * as utils from './utils'; import * as errors from './errors'; @@ -33,7 +35,6 @@ class DB { public static async createDB({ dbPath, crypto, - lock = new Mutex(), fs = require('fs'), logger = new Logger(this.name), fresh = false, @@ -43,7 +44,6 @@ class DB { key: Buffer; ops: Crypto; }; - lock?: MutexInterface; fs?: FileSystem; logger?: Logger; fresh?: boolean; @@ -52,7 +52,6 @@ class DB { const db = new DB({ dbPath, crypto, - lock, fs, logger, }); @@ -67,16 +66,17 @@ class DB { key: Buffer; ops: Crypto; }; - protected lock: MutexInterface; protected fs: FileSystem; protected logger: Logger; protected workerManager?: DBWorkerManagerInterface; protected _db: LevelDB; + protected _dataDb: DBLevel; + protected _transactionsDb: DBLevel; + protected transactionCounter: number = 0; constructor({ dbPath, crypto, - lock, fs, logger, }: { @@ -85,23 +85,25 @@ class DB { key: Buffer; ops: Crypto; }; - lock: MutexInterface; fs: FileSystem; logger: Logger; }) { this.logger = logger; this.dbPath = dbPath; this.crypto = crypto; - this.lock = lock; this.fs = fs; } - get db(): LevelDB { + get db(): LevelDB { return this._db; } - get locked(): boolean { - return this.lock.isLocked(); + get dataDb(): DBLevel { + return this._dataDb; + } + + get transactionsDb(): DBLevel { + return this._transactionsDb; } public async start({ @@ -121,37 +123,11 @@ class DB { throw new errors.ErrorDBDelete(e.message, undefined, e); } } - try { - await this.fs.promises.mkdir(this.dbPath); - } catch (e) { - if (e.code !== 'EEXIST') { - throw new errors.ErrorDBCreate(e.message, undefined, e); - } - } - let dbLevel; - try { - dbLevel = await new Promise>( - (resolve, reject) => { - const db = level( - this.dbPath, - { - keyEncoding: 'binary', - valueEncoding: 'binary', - }, - (e) => { - if (e) { - reject(e); - } else { - resolve(db); - } - }, - ); - }, - ); - } catch (e) { - throw new errors.ErrorDBCreate(e.message, undefined, e); - } - this._db = dbLevel; + const db = await this.setupDb(this.dbPath); + const { dataDb, transactionsDb } = await this.setupRootLevels(db); + this._db = db; + this._dataDb = dataDb; + this._transactionsDb = transactionsDb; this.logger.info(`Started ${this.constructor.name}`); } @@ -187,91 +163,92 @@ class DB { delete this.workerManager; } - public async withLocks( - f: () => Promise, - locks: Array = [this.lock], - ): Promise { - const releases: Array = []; - for (const l of locks) { - releases.push(await l.acquire()); - } - try { - return await f(); - } finally { - // Release them in the opposite order - releases.reverse(); - for (const r of releases) { - r(); - } - } - } - - /** - * Attempts to lock in sequence - * If you don't pass any - * Then it will just lock globally - * Otherwise it tries to run the transaction - * And commits the operations at the very end - * This allows one to create a lock to be shared between mutliple transactions - */ @ready(new errors.ErrorDBNotRunning()) - public async transact( - f: (t: DBTransaction) => Promise, - locks: Array = [this.lock], - ): Promise { - return this.withLocks(async () => { - const tran = new Transaction({ db: this, logger: this.logger }); - let value: T; - try { - value = await f(tran); - await tran.commit(); - } catch (e) { - await tran.rollback(); - throw e; - } - // Only finalize if commit succeeded - await tran.finalize(); - return value; - }, locks); + public transaction(): ResourceAcquire { + return async () => { + const transactionId = this.transactionCounter++; + const transactionDb = await this._level( + transactionId.toString(), + this.transactionsDb, + ); + const tran = await DBTransaction.createTransaction({ + db: this, + transactionId, + transactionDb, + logger: this.logger, + }); + return [ + async (e?: Error) => { + try { + if (e == null) { + try { + await tran.commit(); + } catch (e) { + await tran.rollback(); + throw e; + } + await tran.finalize(); + } else { + await tran.rollback(); + } + } finally { + await tran.destroy(); + } + }, + tran, + ]; + }; } @ready(new errors.ErrorDBNotRunning()) public async level( domain: string, - dbLevel: DBLevel = this._db, - ): Promise { - try { - return await new Promise((resolve, reject) => { - const dbLevelNew = subleveldown(dbLevel, domain, { - keyEncoding: 'binary', - valueEncoding: 'binary', - open: (cb) => { - // This `cb` is defaulted (hardcoded) to a function that emits an error event - // When using `level`, we are able to provide a callback that overrides this `cb` - // However `subleveldown` does not provide a callback parameter - // It provides this `open` option, which requires us to call `cb` to finish - // If we provide an exception as a parameter, it will be received by the `error` event handler - cb(undefined); - resolve(dbLevelNew); - }, - }); - // @ts-ignore error event for subleveldown - dbLevelNew.on('error', (e) => { - // Errors during construction of the sublevel will be emitted as events - reject(e); - }); - }); - } catch (e) { - if (e instanceof RangeError) { - // Some domain prefixes will conflict with the separator - throw new errors.ErrorDBLevelPrefix(); + dbLevel: DBLevel = this._dataDb, + ): ReturnType { + return this._level(domain, dbLevel); + } + + public iterator( + options: AbstractIteratorOptions & { key: false; value: false }, + dbLevel: DBLevel, + ): DBIterator; + public iterator( + options: AbstractIteratorOptions & { key: false }, + dbLevel: DBLevel, + ): DBIterator; + public iterator( + options: AbstractIteratorOptions & { value: false }, + dbLevel: DBLevel, + ): DBIterator; + public iterator( + options?: AbstractIteratorOptions, + dbLevel?: DBLevel, + ): DBIterator; + @ready(new errors.ErrorDBNotRunning()) + public iterator( + options?: AbstractIteratorOptions, + dbLevel: DBLevel = this._dataDb, + ): DBIterator { + const iterator = dbLevel.iterator(options); + const next = iterator.next.bind(iterator); + // @ts-ignore AbstractIterator type is outdated + iterator.next = async (cb) => { + const kv = await next(cb); + if (kv != null) { + kv[1] = await this.deserializeDecrypt(kv[1], true); } - throw e; - } + return kv; + }; + return iterator as unknown as DBIterator; } @ready(new errors.ErrorDBNotRunning()) - public async count(dbLevel: DBLevel = this._db): Promise { + public async clear(dbLevel: DBLevel = this._dataDb): Promise { + await dbLevel.clear(); + } + + @ready(new errors.ErrorDBNotRunning()) + public async count(dbLevel: DBLevel = this._dataDb): Promise { let count = 0; for await (const _ of dbLevel.createKeyStream()) { count++; @@ -279,6 +256,18 @@ class DB { return count; } + @ready(new errors.ErrorDBNotRunning()) + public async dump(dbLevel: DBLevel = this._dataDb): Promise { + const records = {}; + for await (const o of dbLevel.createReadStream()) { + const key = (o as any).key.toString(); + const data = (o as any).value as Buffer; + const value = await this.deserializeDecrypt(data, false); + records[key] = value; + } + return records; + } + public async get( domain: DBDomain, key: string | Buffer, @@ -297,7 +286,7 @@ class DB { ): Promise { let data; try { - data = await this._db.get(utils.domainPath(domain, key)); + data = await this._dataDb.get(utils.domainPath(domain, key)); } catch (e) { if (e.notFound) { return undefined; @@ -327,12 +316,12 @@ class DB { raw: boolean = false, ): Promise { const data = await this.serializeEncrypt(value, raw as any); - return this._db.put(utils.domainPath(domain, key), data); + return this._dataDb.put(utils.domainPath(domain, key), data); } @ready(new errors.ErrorDBNotRunning()) public async del(domain: DBDomain, key: string | Buffer): Promise { - return this._db.del(utils.domainPath(domain, key)); + return this._dataDb.del(utils.domainPath(domain, key)); } @ready(new errors.ErrorDBNotRunning()) @@ -357,7 +346,7 @@ class DB { } } const opsB = await Promise.all(opsP); - return this._db.batch(opsB); + return this._dataDb.batch(opsB); } public async serializeEncrypt(value: any, raw: false): Promise; @@ -434,6 +423,89 @@ class DB { return raw ? plainTextBuf : utils.deserialize(plainTextBuf); } } + + protected async setupDb( + dbPath: string, + ): Promise> { + try { + await this.fs.promises.mkdir(dbPath); + } catch (e) { + if (e.code !== 'EEXIST') { + throw new errors.ErrorDBCreate(e.message, undefined, e); + } + } + let db: LevelDB; + try { + db = await new Promise>( + (resolve, reject) => { + const db = level( + dbPath, + { + keyEncoding: 'binary', + valueEncoding: 'binary', + }, + (e) => { + if (e) { + reject(e); + } else { + resolve(db); + } + }, + ); + }, + ); + } catch (e) { + throw new errors.ErrorDBCreate(e.message, undefined, e); + } + return db; + } + + protected async setupRootLevels( + db: LevelDB, + ): Promise<{ + dataDb: DBLevel; + transactionsDb: DBLevel; + }> { + const dataDb = await this._level('data', db); + const transactionsDb = await this._level('transactions', db); + // Clear any dirty state in the transactions + await transactionsDb.clear(); + return { + dataDb, + transactionsDb, + }; + } + + protected async _level(domain: string, dbLevel: DBLevel): Promise { + try { + return await new Promise((resolve, reject) => { + const dbLevelNew = subleveldown(dbLevel, domain, { + keyEncoding: 'binary', + valueEncoding: 'binary', + open: (cb) => { + // This `cb` is defaulted (hardcoded) to a function that emits an error event + // When using `level`, we are able to provide a callback that overrides this `cb` + // However `subleveldown` does not provide a callback parameter + // It provides this `open` option, which requires us to call `cb` to finish + // If we provide an exception as a parameter, it will be received by the `error` event handler + cb(undefined); + resolve(dbLevelNew); + }, + }); + // @ts-ignore error event for subleveldown + dbLevelNew.on('error', (e) => { + // Errors during construction of the sublevel will be emitted as events + reject(e); + }); + }); + } catch (e) { + if (e instanceof RangeError) { + // Some domain prefixes will conflict with the separator + throw new errors.ErrorDBLevelPrefix(); + } + throw e; + } + } } export default DB; diff --git a/src/DBTransaction.ts b/src/DBTransaction.ts new file mode 100644 index 00000000..fa8ee213 --- /dev/null +++ b/src/DBTransaction.ts @@ -0,0 +1,408 @@ +import type { AbstractIteratorOptions } from 'abstract-leveldown'; +import type DB from './DB'; +import type { POJO, DBDomain, DBLevel, DBIterator, DBOps } from './types'; +import Logger from '@matrixai/logger'; +import { CreateDestroy, ready } from '@matrixai/async-init/dist/CreateDestroy'; +import * as dbUtils from './utils'; +import * as dbErrors from './errors'; + +/** + * Minimal read-committed transaction system + * + * Properties: + * - No dirty reads - cannot read uncommitted writes from other transactions + * - Non-repeatable reads - multiple reads on the same key may read + * different values due to other committed + * transactions + * - Phantom reads - can read entries that are added or deleted by other + * transactions + * - Lost updates - can lose writes if 2 transactions commit writes to the + * same key + * + * To prevent non-repeatable reads, phantom-reads or lost-updates, it is up to the + * user to use advisory read/write locking on relevant keys or ranges of keys. + * + * This does not use LevelDB snapshots provided by the `iterator` method + * which would provide "repeatable-read" isolation level by default + * + * See: https://en.wikipedia.org/wiki/Isolation_(database_systems) + */ +interface DBTransaction extends CreateDestroy {} +@CreateDestroy() +class DBTransaction { + public static async createTransaction({ + db, + transactionDb, + transactionId, + logger = new Logger(this.name), + }: { + db: DB; + transactionDb: DBLevel; + transactionId: number; + logger?: Logger; + }): Promise { + return new this({ + db, + transactionDb, + transactionId, + logger, + }); + } + + public readonly transactionId: number; + + protected db: DB; + protected transactionDb: DBLevel; + protected logger: Logger; + protected _ops: DBOps = []; + protected _callbacksSuccess: Array<() => any> = []; + protected _callbacksFailure: Array<() => any> = []; + protected _committed: boolean = false; + protected _rollbacked: boolean = false; + + public constructor({ + db, + transactionDb, + transactionId, + logger, + }: { + db: DB; + transactionDb: DBLevel; + transactionId: number; + logger: Logger; + }) { + this.logger = logger; + this.db = db; + this.transactionDb = transactionDb; + this.transactionId = transactionId; + } + + public async destroy() { + await this.transactionDb.clear(); + } + + get ops(): Readonly { + return this._ops; + } + + get callbacksSuccess(): Readonly any>> { + return this._callbacksSuccess; + } + + get callbacksFailure(): Readonly any>> { + return this._callbacksFailure; + } + + get committed(): boolean { + return this._committed; + } + + get rollbacked(): boolean { + return this._rollbacked; + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async dump(domain: DBDomain = []): Promise { + let transactionLevel = this.transactionDb; + for (const d of domain) { + transactionLevel = await this.db.level(d, transactionLevel); + } + const records = {}; + for await (const o of transactionLevel.createReadStream()) { + const key = (o as any).key.toString(); + const data = (o as any).value as Buffer; + const value = await this.db.deserializeDecrypt(data, false); + records[key] = value; + } + return records; + } + + public async iterator( + options: AbstractIteratorOptions & { values: false }, + domain?: DBDomain, + ): Promise>; + public async iterator( + options?: AbstractIteratorOptions, + domain?: DBDomain, + ): Promise>; + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async iterator( + options?: AbstractIteratorOptions, + domain: DBDomain = [], + ): Promise { + let dataLevel = this.db.dataDb; + for (const d of domain) { + dataLevel = await this.db.level(d, dataLevel); + } + const dataIterator = dataLevel.iterator({ + ...options, + keys: true, + keyAsBuffer: true, + valuesAsBuffer: true, + }); + let transactionLevel = this.transactionDb; + for (const d of domain) { + transactionLevel = await this.db.level(d, transactionLevel); + } + const tranIterator = transactionLevel.iterator({ + ...options, + keys: true, + keyAsBuffer: true, + valuesAsBuffer: true, + }); + const order = options?.reverse ? 'desc' : 'asc'; + const iterator = { + _ended: false, + _nexting: false, + seek: (k: Buffer | string) => { + if (iterator._ended) { + throw new Error('cannot call seek() after end()'); + } + if (iterator._nexting) { + throw new Error('cannot call seek() before next() has completed'); + } + if (typeof k === 'string') { + k = Buffer.from(k, 'utf-8'); + } + dataIterator.seek(k); + tranIterator.seek(k); + }, + end: async () => { + if (iterator._ended) { + throw new Error('end() already called on iterator'); + } + iterator._ended = true; + // @ts-ignore AbstractIterator type is outdated + await dataIterator.end(); + // @ts-ignore AbstractIterator type is outdated + await tranIterator.end(); + }, + next: async () => { + if (iterator._ended) { + throw new Error('cannot call next() after end()'); + } + if (iterator._nexting) { + throw new Error( + 'cannot call next() before previous next() has completed', + ); + } + iterator._nexting = true; + const decryptKV = async ([key, data]: [ + Buffer, + Buffer | undefined, + ]): Promise<[Buffer, Buffer | undefined]> => { + if (data != null) { + data = await this.db.deserializeDecrypt(data, true); + } + return [key, data]; + }; + try { + // @ts-ignore AbstractIterator type is outdated + const tranKV = (await tranIterator.next()) as + | [Buffer, Buffer | undefined] + | undefined; + // @ts-ignore AbstractIterator type is outdated + const dataKV = (await dataIterator.next()) as + | [Buffer, Buffer | undefined] + | undefined; + // If both are finished, iterator is finished + if (tranKV == null && dataKV == null) { + return undefined; + } + // If tranIterator is not finished but dataIterator is finished + // continue with tranIterator + if (tranKV != null && dataKV == null) { + return decryptKV(tranKV); + } + // If tranIterator is finished but dataIterator is not finished + // continue with the dataIterator + if (tranKV == null && dataKV != null) { + return decryptKV(dataKV); + } + const [tranKey, tranData] = tranKV as [Buffer, Buffer | undefined]; + const [dataKey, dataData] = dataKV as [Buffer, Buffer | undefined]; + const keyCompare = Buffer.compare(tranKey, dataKey); + if (keyCompare < 0) { + if (order === 'asc') { + dataIterator.seek(tranKey); + return decryptKV([tranKey, tranData]); + } else if (order === 'desc') { + tranIterator.seek(dataKey); + return decryptKV([dataKey, dataData]); + } + } else if (keyCompare > 0) { + if (order === 'asc') { + tranIterator.seek(dataKey); + return decryptKV([dataKey, dataData]); + } else if (order === 'desc') { + dataIterator.seek(tranKey); + return decryptKV([tranKey, tranData]); + } + } else { + return decryptKV([tranKey, tranData]); + } + } finally { + iterator._nexting = false; + } + }, + [Symbol.asyncIterator]: async function* () { + try { + let kv; + while ((kv = await iterator.next()) !== undefined) { + yield kv; + } + } finally { + if (!iterator._ended) await iterator.end(); + } + }, + }; + return iterator; + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async clear(domain: DBDomain = []): Promise { + for await (const [k] of await this.iterator({ values: false }, domain)) { + await this.del(domain, k); + } + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async count(domain: DBDomain = []): Promise { + let count = 0; + for await (const _ of await this.iterator({ values: false }, domain)) { + count++; + } + return count; + } + + public async get( + domain: DBDomain, + key: string | Buffer, + raw?: false, + ): Promise; + public async get( + domain: DBDomain, + key: string | Buffer, + raw: true, + ): Promise; + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async get( + domain: DBDomain, + key: string | Buffer, + raw: boolean = false, + ): Promise { + const path = dbUtils.domainPath(domain, key); + let value: T | undefined; + try { + const data = await this.transactionDb.get(path); + value = await this.db.deserializeDecrypt(data, raw as any); + } catch (e) { + if (e.notFound) { + value = await this.db.get(domain, key, raw as any); + // Don't set it in the transaction DB + // Because this is not a repeatable-read "snapshot" + } else { + throw e; + } + } + return value; + } + + public async put( + domain: DBDomain, + key: string | Buffer, + value: any, + raw?: false, + ): Promise; + public async put( + domain: DBDomain, + key: string | Buffer, + value: Buffer, + raw: true, + ): Promise; + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async put( + domain: DBDomain, + key: string | Buffer, + value: any, + raw: boolean = false, + ): Promise { + const path = dbUtils.domainPath(domain, key); + const data = await this.db.serializeEncrypt(value, raw as any); + await this.transactionDb.put(path, data); + this._ops.push({ + type: 'put', + domain, + key, + value, + raw, + }); + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async del(domain: DBDomain, key: string | Buffer): Promise { + const path = dbUtils.domainPath(domain, key); + await this.transactionDb.del(path); + this._ops.push({ + type: 'del', + domain, + key, + }); + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public queueSuccess(f: () => any): void { + this._callbacksSuccess.push(f); + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public queueFailure(f: () => any): void { + this._callbacksFailure.push(f); + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async commit(): Promise { + if (this._rollbacked) { + throw new dbErrors.ErrorDBTransactionRollbacked(); + } + if (this._committed) { + return; + } + this._committed = true; + try { + await this.db.batch(this._ops); + } catch (e) { + this._committed = false; + throw e; + } + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async rollback(): Promise { + if (this._committed) { + throw new dbErrors.ErrorDBTransactionCommitted(); + } + if (this._rollbacked) { + return; + } + this._rollbacked = true; + for (const f of this._callbacksFailure) { + await f(); + } + } + + @ready(new dbErrors.ErrorDBTransactionDestroyed()) + public async finalize(): Promise { + if (this._rollbacked) { + throw new dbErrors.ErrorDBTransactionRollbacked(); + } + if (!this._committed) { + throw new dbErrors.ErrorDBTransactionNotCommited(); + } + for (const f of this._callbacksSuccess) { + await f(); + } + } +} + +export default DBTransaction; diff --git a/src/Transaction.ts b/src/Transaction.ts deleted file mode 100644 index 1df71b11..00000000 --- a/src/Transaction.ts +++ /dev/null @@ -1,177 +0,0 @@ -import type DB from './DB'; -import type { DBDomain, DBOps, DBTransaction } from './types'; - -import Logger from '@matrixai/logger'; -import * as dbUtils from './utils'; -import * as dbErrors from './errors'; - -/** - * Minimal transaction system - * Abstracts on top of the leveldb batch system - * A makeshift "read-committed" isolation level, reads can be dirty (but prevented due to advisory locks) - * Will only read data that have been committed, won't see dirty reads. - * - * Leveldb is not an MVCC database. - * This when combined with advisory locking provides a "read-commited" isolation-level context. - * This means dirty reads are not possible. But non-repeatable reads and phantom reads are all possible. - * If we had access to leveldb snapshots, we could level up to "repeatable-read" isolation level and prevent - * non-repeatable reads for both iteration/streaming and get. However we would still have lost-updates. - */ -class Transaction implements DBTransaction { - protected db: DB; - protected logger: Logger; - protected _ops: DBOps = []; - protected _snap: Map = new Map(); - protected _callbacksSuccess: Array<() => any> = []; - protected _callbacksFailure: Array<() => any> = []; - protected _committed: boolean = false; - protected _rollbacked: boolean = false; - - public constructor({ db, logger }: { db: DB; logger?: Logger }) { - this.logger = logger ?? new Logger(this.constructor.name); - this.db = db; - } - - get ops(): Readonly { - return this._ops; - } - - get snap(): ReadonlyMap { - return this._snap; - } - - get callbacksSuccess(): Readonly any>> { - return this._callbacksSuccess; - } - - get callbacksFailure(): Readonly any>> { - return this._callbacksFailure; - } - - get committed(): boolean { - return this._committed; - } - - get rollbacked(): boolean { - return this._rollbacked; - } - - public async get( - domain: DBDomain, - key: string | Buffer, - raw?: false, - ): Promise; - public async get( - domain: DBDomain, - key: string | Buffer, - raw: true, - ): Promise; - public async get( - domain: DBDomain, - key: string | Buffer, - raw: boolean = false, - ): Promise { - const path = dbUtils.domainPath(domain, key).toString('binary'); - let value: T | undefined; - if (this._snap.has(path)) { - value = this._snap.get(path); - } else { - value = await this.db.get(domain, key, raw as any); - // Don't need this atm - // there is no repeatable-read "snapshot" - // this._snap.set(path, value); - // dirty reads - } - return value; - } - - public async put( - domain: DBDomain, - key: string | Buffer, - value: any, - raw?: false, - ): Promise; - public async put( - domain: DBDomain, - key: string | Buffer, - value: Buffer, - raw: true, - ): Promise; - public async put( - domain: DBDomain, - key: string | Buffer, - value: any, - raw: boolean = false, - ): Promise { - const path = dbUtils.domainPath(domain, key).toString('binary'); - this._snap.set(path, value); - this._ops.push({ - type: 'put', - domain, - key, - value, - raw, - }); - } - - public async del(domain: DBDomain, key: string | Buffer): Promise { - const path = dbUtils.domainPath(domain, key).toString('binary'); - this._snap.set(path, undefined); - this._ops.push({ - type: 'del', - domain, - key, - }); - } - - public queueSuccess(f: () => any): void { - this._callbacksSuccess.push(f); - } - - public queueFailure(f: () => any): void { - this._callbacksFailure.push(f); - } - - public async commit(): Promise { - if (this._rollbacked) { - throw new dbErrors.ErrorDBRollbacked(); - } - if (this._committed) { - return; - } - this._committed = true; - try { - await this.db.batch(this._ops); - } catch (e) { - this._committed = false; - throw e; - } - } - - public async rollback(): Promise { - if (this._committed) { - throw new dbErrors.ErrorDBCommitted(); - } - if (this._rollbacked) { - return; - } - this._rollbacked = true; - for (const f of this._callbacksFailure) { - await f(); - } - } - - public async finalize(): Promise { - if (this._rollbacked) { - throw new dbErrors.ErrorDBRollbacked(); - } - if (!this._committed) { - throw new dbErrors.ErrorDBNotCommited(); - } - for (const f of this._callbacksSuccess) { - await f(); - } - } -} - -export default Transaction; diff --git a/src/errors.ts b/src/errors.ts index 0c3d92f0..af0bba17 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -30,11 +30,13 @@ class ErrorDBDecrypt extends ErrorDB {} class ErrorDBParse extends ErrorDB {} -class ErrorDBCommitted extends ErrorDB {} +class ErrorDBTransactionDestroyed extends ErrorDB {} -class ErrorDBNotCommited extends ErrorDB {} +class ErrorDBTransactionCommitted extends ErrorDB {} -class ErrorDBRollbacked extends ErrorDB {} +class ErrorDBTransactionNotCommited extends ErrorDB {} + +class ErrorDBTransactionRollbacked extends ErrorDB {} export { ErrorDB, @@ -46,7 +48,8 @@ export { ErrorDBLevelPrefix, ErrorDBDecrypt, ErrorDBParse, - ErrorDBCommitted, - ErrorDBNotCommited, - ErrorDBRollbacked, + ErrorDBTransactionDestroyed, + ErrorDBTransactionCommitted, + ErrorDBTransactionNotCommited, + ErrorDBTransactionRollbacked, }; diff --git a/src/index.ts b/src/index.ts index bd1661e9..897e4303 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ export { default as DB } from './DB'; -export { default as Transaction } from './Transaction'; +export { default as DBTransaction } from './DBTransaction'; export * as utils from './utils'; export * as errors from './errors'; export * from './types'; diff --git a/src/types.ts b/src/types.ts index 03a4c506..8bb952e4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -36,6 +36,17 @@ type DBLevel = LevelUp< AbstractIterator >; +/** + * Custom type for our iterator + * This takes over from the outdated AbstractIterator used in abstract-leveldown + */ +type DBIterator = { + seek: (k: Buffer | string) => void; + next: () => Promise<[K, V] | undefined>; + end: () => Promise; + [Symbol.asyncIterator]: () => AsyncGenerator<[K, V]>; +}; + type DBOp_ = | { domain: DBDomain; @@ -60,44 +71,6 @@ type DBOp = type DBOps = Array; -interface DBTransaction { - ops: Readonly; - snap: ReadonlyMap; - callbacksSuccess: Readonly any>>; - callbacksFailure: Readonly any>>; - committed: boolean; - - get( - domain: DBDomain, - key: string | Buffer, - raw?: false, - ): Promise; - get( - domain: DBDomain, - key: string | Buffer, - raw: true, - ): Promise; - - put( - domain: DBDomain, - key: string | Buffer, - value: any, - raw?: false, - ): Promise; - put( - domain: DBDomain, - key: string | Buffer, - value: Buffer, - raw: true, - ): Promise; - - del(domain: DBDomain, key: string | Buffer): Promise; - - queueSuccess(f: () => any): void; - - queueFailure(f: () => any): void; -} - export type { POJO, FileSystem, @@ -105,7 +78,7 @@ export type { DBWorkerManagerInterface, DBDomain, DBLevel, + DBIterator, DBOp, DBOps, - DBTransaction, }; diff --git a/src/utils.ts b/src/utils.ts index 58a65a07..b7ceee97 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,4 @@ import type { DBDomain } from './types'; - import sublevelprefixer from 'sublevel-prefixer'; import * as dbErrors from './errors'; diff --git a/tests/DB.test.ts b/tests/DB.test.ts index 27cdadcd..71933fc9 100644 --- a/tests/DB.test.ts +++ b/tests/DB.test.ts @@ -1,6 +1,5 @@ import type { DBOp } from '@/types'; import type { DBWorkerModule } from './workers/dbWorkerModule'; - import os from 'os'; import path from 'path'; import fs from 'fs'; @@ -10,15 +9,18 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import { WorkerManager } from '@matrixai/workers'; import { spawn, Worker } from 'threads'; import DB from '@/DB'; -import * as utils from './utils'; +import * as utils from '@/utils'; +import * as testUtils from './utils'; -describe('DB', () => { - const logger = new Logger('DB Test', LogLevel.WARN, [new StreamHandler()]); +describe(DB.name, () => { + const logger = new Logger(`${DB.name} Test`, LogLevel.WARN, [ + new StreamHandler(), + ]); const crypto = { - key: utils.generateKeySync(256), + key: testUtils.generateKeySync(256), ops: { - encrypt: utils.encrypt, - decrypt: utils.decrypt, + encrypt: testUtils.encrypt, + decrypt: testUtils.decrypt, }, }; let dataDir: string; @@ -99,7 +101,6 @@ describe('DB', () => { const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, crypto, logger }); await db.start(); - await db.db.clear(); await db.put([], 'a', 'value0'); expect(await db.get([], 'a')).toBe('value0'); await db.del([], 'a'); @@ -160,10 +161,10 @@ describe('DB', () => { const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, crypto, logger }); await db.start(); - await db.db.put('a', await db.serializeEncrypt('value0', false)); + await db.dataDb.put('a', await db.serializeEncrypt('value0', false)); expect(await db.get([], 'a')).toBe('value0'); await db.put([], 'b', 'value0'); - expect(await db.deserializeDecrypt(await db.db.get('b'), false)).toBe( + expect(await db.deserializeDecrypt(await db.dataDb.get('b'), false)).toBe( 'value0', ); const level1 = await db.level('level1'); @@ -252,7 +253,7 @@ describe('DB', () => { await db.put([], k, 'value'); } const keysIterated: Array = []; - for await (const k of db.db.createKeyStream()) { + for await (const k of db.dataDb.createKeyStream()) { // Keys are buffers due to key encoding keysIterated.push(k.toString('utf-8')); } @@ -270,13 +271,13 @@ describe('DB', () => { await db.put([], k, 'value'); } const keysIterated: Array = []; - for await (const k of db.db.createKeyStream()) { + for await (const k of db.dataDb.createKeyStream()) { keysIterated.push(k as Buffer); } expect(keys).not.toStrictEqual(keysIterated); expect(keys.sort(Buffer.compare)).toStrictEqual(keysIterated); // Buffers can be considered can be considered big-endian numbers - const keysNumeric = keys.map(utils.bytes2BigInt); + const keysNumeric = keys.map(testUtils.bytes2BigInt); // Therefore lexicographic ordering of buffers is equal to numeric ordering of bytes expect( keysNumeric.slice(1).every((item, i) => keysNumeric[i] <= item), @@ -294,7 +295,7 @@ describe('DB', () => { await db.put([], Buffer.from(lexi.pack(k)), 'value'); } const keysIterated: Array = []; - for await (const k of db.db.createKeyStream()) { + for await (const k of db.dataDb.createKeyStream()) { // Keys are buffers due to key encoding keysIterated.push(lexi.unpack([...k])); } @@ -341,7 +342,6 @@ describe('DB', () => { const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, crypto, logger }); await db.start(); - await db.db.clear(); // 'string' is the same as Buffer.from('string') // even across levels await db.put([], 'string', 'value1'); @@ -373,7 +373,7 @@ describe('DB', () => { await db.put([], 'b', 'value1'); await db.put([], 'c', 'value2'); await db.put([], 'd', 'value3'); - const keyStream = db.db.createKeyStream(); + const keyStream = db.dataDb.createKeyStream(); const ops = await new Promise>((resolve, reject) => { const ops: Array = []; keyStream.on('data', (k) => { @@ -398,6 +398,45 @@ describe('DB', () => { expect(await db.get([], 'd')).toBeUndefined(); await db.stop(); }); + test('iterating sublevels', async () => { + const dbPath = `${dataDir}/db`; + const db = await DB.createDB({ dbPath, crypto, logger }); + await db.put([], 'a', 'value0'); + await db.put([], 'b', 'value1'); + await db.put([], 'c', 'value2'); + await db.put([], 'd', 'value3'); + await db.put(['level1'], 'a', 'value0'); + await db.put(['level1'], 'b', 'value1'); + await db.put(['level1'], 'c', 'value2'); + await db.put(['level1'], 'd', 'value3'); + let results: Array<[string, string]>; + results = []; + for await (const [k, v] of db.iterator()) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + expect(results).toStrictEqual([ + [`${utils.prefix}level1${utils.prefix}a`, 'value0'], + [`${utils.prefix}level1${utils.prefix}b`, 'value1'], + [`${utils.prefix}level1${utils.prefix}c`, 'value2'], + [`${utils.prefix}level1${utils.prefix}d`, 'value3'], + ['a', 'value0'], + ['b', 'value1'], + ['c', 'value2'], + ['d', 'value3'], + ]); + results = []; + const level1 = await db.level('level1'); + for await (const [k, v] of db.iterator(undefined, level1)) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + expect(results).toStrictEqual([ + ['a', 'value0'], + ['b', 'value1'], + ['c', 'value2'], + ['d', 'value3'], + ]); + await db.stop(); + }); test('counting sublevels', async () => { const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, crypto, logger }); @@ -438,7 +477,6 @@ describe('DB', () => { }); db.setWorkerManager(workerManager); await db.start(); - await db.db.clear(); await db.put([], 'a', 'value0'); expect(await db.get([], 'a')).toBe('value0'); await db.del([], 'a'); @@ -508,7 +546,6 @@ describe('DB', () => { const dbPath = `${dataDir}/db`; const db = await DB.createDB({ dbPath, logger }); await db.start(); - await db.db.clear(); await db.put([], 'a', 'value0'); expect(await db.get([], 'a')).toBe('value0'); await db.del([], 'a'); diff --git a/tests/DBTransaction.test.ts b/tests/DBTransaction.test.ts new file mode 100644 index 00000000..7d126465 --- /dev/null +++ b/tests/DBTransaction.test.ts @@ -0,0 +1,644 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs'; +import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; +import { withF } from '@matrixai/resources'; +import DB from '@/DB'; +import DBTransaction from '@/DBTransaction'; +import * as utils from '@/utils'; +import * as testUtils from './utils'; + +describe(DBTransaction.name, () => { + const logger = new Logger(`${DBTransaction.name} test`, LogLevel.WARN, [ + new StreamHandler(), + ]); + const crypto = { + key: testUtils.generateKeySync(256), + ops: { + encrypt: testUtils.encrypt, + decrypt: testUtils.decrypt, + }, + }; + let dataDir: string; + let db: DB; + beforeEach(async () => { + dataDir = await fs.promises.mkdtemp( + path.join(os.tmpdir(), 'encryptedfs-test-'), + ); + const dbPath = `${dataDir}/db`; + db = await DB.createDB({ dbPath, crypto, logger }); + }); + afterEach(async () => { + await db.stop(); + await fs.promises.rm(dataDir, { + force: true, + recursive: true, + }); + }); + test('snapshot state is cleared after releasing transactions', async () => { + const acquireTran1 = db.transaction(); + const [releaseTran1, tran1] = await acquireTran1(); + await tran1!.put([], 'hello', 'world'); + const acquireTran2 = db.transaction(); + const [releaseTran2, tran2] = await acquireTran2(); + await tran2!.put([], 'hello', 'world'); + expect(await db.dump(db.transactionsDb)).toStrictEqual({ + [`${utils.prefix}0${utils.prefix}hello`]: 'world', + [`${utils.prefix}1${utils.prefix}hello`]: 'world', + }); + await releaseTran1(); + expect(await db.dump(db.transactionsDb)).toStrictEqual({ + [`${utils.prefix}1${utils.prefix}hello`]: 'world', + }); + await releaseTran2(); + expect(await db.dump(db.transactionsDb)).toStrictEqual({}); + }); + test('get, put and del', async () => { + const p = withF([db.transaction()], async ([tran]) => { + expect(await tran.get([], 'foo')).toBeUndefined(); + // Add foo -> bar to the transaction + await tran.put([], 'foo', 'bar'); + // Add hello -> world to the transaction + await tran.put([], 'hello', 'world'); + expect(await tran.get([], 'foo')).toBe('bar'); + expect(await tran.get([], 'hello')).toBe('world'); + expect(await tran.dump()).toStrictEqual({ + foo: 'bar', + hello: 'world', + }); + // Delete hello -> world + await tran.del([], 'hello'); + // Transaction state should be used + expect(Object.entries(await db.dump(db.transactionsDb)).length > 0).toBe( + true, + ); + }); + // While the transaction is executed, there is no data + expect(await db.dump()).toStrictEqual({}); + await p; + // Now the state should be applied to the DB + expect(await db.dump()).toStrictEqual({ + foo: 'bar', + }); + // Transaction state is cleared + expect(await db.dump(db.transactionsDb)).toStrictEqual({}); + }); + test('transactional clear', async () => { + await db.put([], '1', '1'); + await db.put([], '2', '2'); + await db.put([], '3', '3'); + await withF([db.transaction()], async ([tran]) => { + await tran.clear(); + }); + expect(await db.dump()).toStrictEqual({}); + await db.clear(); + await db.put([], '1', '1'); + await db.put(['level1'], '2', '2'); + await db.put(['level1', 'level2'], '3', '3'); + await withF([db.transaction()], async ([tran]) => { + await tran.clear(['level1']); + }); + expect(await db.dump()).toStrictEqual({ + '1': '1', + }); + }); + test('transactional count', async () => { + await db.put([], '1', '1'); + await db.put([], '2', '2'); + await db.put([], '3', '3'); + await withF([db.transaction()], async ([tran]) => { + expect(await tran.count()).toBe(3); + }); + await db.clear(); + await db.put([], '1', '1'); + await db.put(['level1'], '2', '2'); + await db.put(['level1', 'level2'], '3', '3'); + await withF([db.transaction()], async ([tran]) => { + expect(await tran.count(['level1'])).toBe(2); + }); + }); + test('no dirty reads', async () => { + await withF([db.transaction()], async ([tran1]) => { + expect(await tran1.get([], 'hello')).toBeUndefined(); + await withF([db.transaction()], async ([tran2]) => { + await tran2.put([], 'hello', 'world'); + // `tran2` has not yet committed + expect(await tran1.get([], 'hello')).toBeUndefined(); + }); + }); + await db.clear(); + await withF([db.transaction()], async ([tran1]) => { + expect(await tran1.get([], 'hello')).toBeUndefined(); + await tran1.put([], 'hello', 'foo'); + await withF([db.transaction()], async ([tran2]) => { + // `tran1` has not yet committed + expect(await tran2.get([], 'hello')).toBeUndefined(); + await tran2.put([], 'hello', 'bar'); + // `tran2` has not yet committed + expect(await tran1.get([], 'hello')).toBe('foo'); + }); + }); + }); + test('non-repeatable reads', async () => { + await withF([db.transaction()], async ([tran1]) => { + expect(await tran1.get([], 'hello')).toBeUndefined(); + await withF([db.transaction()], async ([tran2]) => { + await tran2.put([], 'hello', 'world'); + }); + // `tran2` is now committed + expect(await tran1.get([], 'hello')).toBe('world'); + }); + await db.clear(); + await withF([db.transaction()], async ([tran1]) => { + expect(await tran1.get([], 'hello')).toBeUndefined(); + await tran1.put([], 'hello', 'foo'); + await withF([db.transaction()], async ([tran2]) => { + // `tran1` has not yet committed + expect(await tran2.get([], 'hello')).toBeUndefined(); + await tran2.put([], 'hello', 'bar'); + }); + // `tran2` is now committed + // however because `foo` has been written in tran1, it stays as `foo` + expect(await tran1.get([], 'hello')).toBe('foo'); + }); + }); + test('phantom reads', async () => { + await db.put([], '1', '1'); + await db.put([], '2', '2'); + await db.put([], '3', '3'); + let rows: Array<[string, string]>; + await withF([db.transaction()], async ([tran1]) => { + rows = []; + for await (const [k, v] of await tran1.iterator()) { + rows.push([k.toString(), JSON.parse(v.toString())]); + } + expect(rows).toStrictEqual([ + ['1', '1'], + ['2', '2'], + ['3', '3'], + ]); + await withF([db.transaction()], async ([tran2]) => { + await tran2.del([], '1'); + await tran2.put([], '4', '4'); + rows = []; + for await (const [k, v] of await tran1.iterator()) { + rows.push([k.toString(), JSON.parse(v.toString())]); + } + expect(rows).toStrictEqual([ + ['1', '1'], + ['2', '2'], + ['3', '3'], + ]); + }); + rows = []; + for await (const [k, v] of await tran1.iterator()) { + rows.push([k.toString(), JSON.parse(v.toString())]); + } + expect(rows).toStrictEqual([ + ['2', '2'], + ['3', '3'], + ['4', '4'], + ]); + }); + }); + test('lost updates', async () => { + await withF([db.transaction()], async ([tran1]) => { + await tran1.put([], 'hello', 'foo'); + await withF([db.transaction()], async ([tran2]) => { + await tran2.put([], 'hello', 'bar'); + }); + expect(await tran1.get([], 'hello')).toBe('foo'); + }); + // `tran2` write is lost because `tran1` committed last + expect(await db.get([], 'hello')).toBe('foo'); + }); + test('iterator with same largest key', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + | k | k = k | k = 11 | k = 11 | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await db.put([], 'k', 'k'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + await tran.put([], 'k', '11'); + const iterator = await tran.iterator(); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual([ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ['j', '10'], + ['k', '11'], + ]); + }); + test('iterator with same largest key in reverse', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + | k | k = k | k = 11 | k = 11 | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await db.put([], 'k', 'k'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + await tran.put([], 'k', '11'); + const iterator = await tran.iterator({ reverse: true }); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual( + [ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ['j', '10'], + ['k', '11'], + ].reverse(), + ); + }); + test('iterator with snapshot largest key', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + const iterator = await tran.iterator(); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual([ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ['j', '10'], + ]); + }); + test('iterator with snapshot largest key in reverse', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + const iterator = await tran.iterator({ reverse: true }); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual( + [ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ['j', '10'], + ].reverse(), + ); + }); + test('iterator with db largest key', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + const iterator = await tran.iterator(); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual([ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ]); + }); + test('iterator with db largest key in reverse', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + */ + const results: Array<[string, string]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + const iterator = await tran.iterator({ reverse: true }); + for await (const [k, v] of iterator) { + results.push([k.toString(), JSON.parse(v.toString())]); + } + }); + expect(results).toStrictEqual( + [ + ['a', '1'], + ['b', 'b'], + ['c', '3'], + ['d', 'd'], + ['e', '5'], + ['f', '6'], + ['h', 'h'], + ].reverse(), + ); + }); + test('iterator with undefined values', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + | k | k = k | k = 11 | k = 11 | + */ + const results: Array<[string, undefined]> = []; + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await db.put([], 'k', 'k'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + await tran.put([], 'k', '11'); + const iterator = await tran.iterator({ values: false }); + for await (const [k, v] of iterator) { + results.push([k.toString(), v]); + } + }); + expect(results).toStrictEqual([ + ['a', undefined], + ['b', undefined], + ['c', undefined], + ['d', undefined], + ['e', undefined], + ['f', undefined], + ['h', undefined], + ['j', undefined], + ['k', undefined], + ]); + }); + test('iterator using seek and next', async () => { + /* + | KEYS | DB | SNAPSHOT | RESULT | + |------|-------|----------|--------| + | a | a = a | a = 1 | a = 1 | + | b | b = b | | b = b | + | c | | c = 3 | c = 3 | + | d | d = d | | d = d | + | e | e = e | e = 5 | e = 5 | + | f | | f = 6 | f = 6 | + | g | | | | + | h | h = h | | h = h | + | i | | | | + | j | | j = 10 | j = 10 | + | k | k = k | k = 11 | k = 11 | + */ + await db.put([], 'a', 'a'); + await db.put([], 'b', 'b'); + await db.put([], 'd', 'd'); + await db.put([], 'e', 'e'); + await db.put([], 'h', 'h'); + await db.put([], 'k', 'k'); + await withF([db.transaction()], async ([tran]) => { + await tran.put([], 'a', '1'); + await tran.put([], 'c', '3'); + await tran.put([], 'e', '5'); + await tran.put([], 'f', '6'); + await tran.put([], 'j', '10'); + await tran.put([], 'k', '11'); + const iterator = await tran.iterator(); + iterator.seek('a'); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('a'), + Buffer.from('"1"'), + ]); + iterator.seek('a'); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('a'), + Buffer.from('"1"'), + ]); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('b'), + Buffer.from('"b"'), + ]); + iterator.seek('g'); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('h'), + Buffer.from('"h"'), + ]); + iterator.seek('h'); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('h'), + Buffer.from('"h"'), + ]); + expect(await iterator.next()).toStrictEqual([ + Buffer.from('j'), + Buffer.from('"10"'), + ]); + await iterator.end(); + }); + }); + test('queue success hooks', async () => { + const results: Array = []; + const mockSuccess1 = jest.fn(() => { + results.push(1); + }); + const mockSuccess2 = jest.fn(() => { + results.push(2); + }); + const mockFailure = jest.fn(); + await withF([db.transaction()], async ([tran]) => { + tran.queueSuccess(mockSuccess1); + tran.queueSuccess(mockSuccess2); + tran.queueFailure(mockFailure); + }); + expect(mockSuccess1).toBeCalled(); + expect(mockSuccess2).toBeCalled(); + expect(mockFailure).not.toBeCalled(); + expect(results).toStrictEqual([1, 2]); + }); + test('queue failure hooks', async () => { + const results: Array = []; + const mockSuccess = jest.fn(); + const mockFailure1 = jest.fn(() => { + results.push(1); + }); + const mockFailure2 = jest.fn(() => { + results.push(2); + }); + await expect( + withF([db.transaction()], async ([tran]) => { + tran.queueSuccess(mockSuccess); + tran.queueFailure(mockFailure1); + tran.queueFailure(mockFailure2); + throw new Error('Something bad happened'); + }), + ).rejects.toThrow('Something bad happened'); + expect(mockSuccess).not.toBeCalled(); + expect(mockFailure1).toBeCalled(); + expect(mockFailure2).toBeCalled(); + expect(results).toStrictEqual([1, 2]); + }); + test('rollback on error', async () => { + await db.put([], '1', 'a'); + await db.put([], '2', 'b'); + const mockFailure = jest.fn(); + await expect( + withF([db.transaction()], async ([tran]) => { + await tran.put([], '1', '1'); + await tran.put([], '2', '2'); + tran.queueFailure(mockFailure); + throw new Error('Oh no!'); + }), + ).rejects.toThrow('Oh no!'); + expect(mockFailure).toBeCalled(); + expect(await db.get([], '1')).toBe('a'); + expect(await db.get([], '2')).toBe('b'); + }); +});