Comparing version 2.6.0-alpha1 to 2.6.0-alpha2
@@ -0,0 +0,0 @@ import { WeakLRUCache, clearKeptObjects } from './native.js'; |
@@ -0,0 +0,0 @@ declare namespace lmdb { |
@@ -0,0 +0,0 @@ import { EventEmitter } from 'events'; |
@@ -0,0 +0,0 @@ export function levelup(store) { |
import { dirname, join, default as pathModule } from 'path'; | ||
import { fileURLToPath } from 'url'; | ||
import loadNAPI from 'node-gyp-build-optional-packages'; | ||
export let Env, Txn, Dbi, Compression, Cursor, getAddress, createBufferForAddress, clearKeptObjects, globalBuffer, setGlobalBuffer, arch, fs, os, onExit, tmpdir, lmdbError, path, EventEmitter, orderedBinary, MsgpackrEncoder, WeakLRUCache, setEnvMap, getEnvMap, getByBinary, detachBuffer, write, position, iterate, prefetch, resetTxn, getCurrentValue, getCurrentShared, getStringByBinary, getSharedByBinary, getSharedBuffer, compress; | ||
export let Env, Txn, Dbi, Compression, Cursor, getAddress, createBufferForAddress, clearKeptObjects, globalBuffer, setGlobalBuffer, arch, fs, os, onExit, tmpdir, lmdbError, path, EventEmitter, orderedBinary, MsgpackrEncoder, WeakLRUCache, setEnvMap, getEnvMap, getByBinary, detachBuffer, startRead, write, position, iterate, prefetch, resetTxn, getCurrentValue, getCurrentShared, getStringByBinary, getSharedByBinary, getSharedBuffer, compress; | ||
@@ -56,2 +56,3 @@ path = pathModule; | ||
detachBuffer = externals.detachBuffer; | ||
startRead = externals.startRead; | ||
setGlobalBuffer = externals.setGlobalBuffer; | ||
@@ -58,0 +59,0 @@ globalBuffer = externals.globalBuffer; |
@@ -225,3 +225,3 @@ import { Compression, getAddress, arch, fs, path as pathModule, lmdbError, EventEmitter, MsgpackrEncoder, Env, Dbi, tmpdir, os, nativeAddon } from './native.js'; | ||
this.encoder = new Encoder(Object.assign( | ||
assignConstrainedProperties(['copyBuffers', 'getStructures', 'saveStructures', 'useFloat32', 'useRecords', 'structuredClone', 'variableMapSize', 'useTimestamp32', 'largeBigIntToFloat', 'encodeUndefinedAsNil', 'int64AsNumber', 'onInvalidDate', 'mapsAsObjects', 'useTag259ForMaps', 'pack', 'maxSharedStructures', 'shouldShareStructure'], | ||
assignConstrainedProperties(['copyBuffers', 'getStructures', 'saveStructures', 'useFloat32', 'useRecords', 'structuredClone', 'variableMapSize', 'useTimestamp32', 'largeBigIntToFloat', 'encodeUndefinedAsNil', 'int64AsNumber', 'onInvalidDate', 'mapsAsObjects', 'useTag259ForMaps', 'pack', 'maxSharedStructures', 'shouldShareStructure', 'randomAccessStructure'], | ||
this.sharedStructuresKey ? this.setupSharedStructures() : { | ||
@@ -228,0 +228,0 @@ copyBuffers: true, // need to copy any embedded buffers that are found since we use unsafe buffers |
{ | ||
"name": "lmdb", | ||
"author": "Kris Zyp", | ||
"version": "2.6.0-alpha1", | ||
"version": "2.6.0-alpha2", | ||
"description": "Simple, efficient, scalable, high-performance LMDB interface", | ||
@@ -9,3 +9,3 @@ "license": "MIT", | ||
"type": "git", | ||
"url": "git+ssh://git@github.com/DoctorEvidence/lmdb-js.git" | ||
"url": "git+ssh://git@github.com/kriszyp/lmdb-js.git" | ||
}, | ||
@@ -44,3 +44,4 @@ "keywords": [ | ||
"/*.ts", | ||
"/*.gyp" | ||
"/*.gyp", | ||
"/bin" | ||
], | ||
@@ -52,3 +53,3 @@ "types": "./index.d.ts", | ||
"bin": { | ||
"download-lmdb-prebuilds": "./bin/download-prebuilds.js download" | ||
"download-lmdb-prebuilds": "./bin/download-prebuilds.js" | ||
}, | ||
@@ -61,8 +62,10 @@ "scripts": { | ||
"prepare": "rollup -c", | ||
"before-publish": "rollup -c && prebuildify-ci download && prebuildify-platform-packages --target 16.14.0 && prebuildify-platform-packages --target 14.19.1 && prebuildify-platform-packages --target 18.0.0 && set ENABLE_V8_FUNCTIONS=false&& prebuildify-platform-packages --napi --platform-packages --target 16.14.0 && node util/set-optional-deps.cjs && npm run test", | ||
"prebuild-libc-musl": "ENABLE_V8_FUNCTIONS=false prebuildify-platform-packages --tag-libc --napi --platform-packages --target 16.14.2", | ||
"prebuild-libc": "prebuildify-platform-packages --tag-libc --target 18.0.0 && prebuildify-platform-packages --napi --platform-packages --tag-libc --target 16.14.2", | ||
"prebuild-libc-arm7": "prebuildify-platform-packages --napi --platform-packages --tag-libc --target 16.14.2", | ||
"before-publish": "rollup -c && prebuildify-ci download && node util/set-optional-deps.cjs && npm run test", | ||
"prebuild-libc-musl": "ENABLE_V8_FUNCTIONS=false prebuildify-platform-packages --tag-libc --napi --platform-packages --target 16.16.0", | ||
"prebuild-libc": "prebuildify-platform-packages --tag-libc --target 18.7.0 && prebuildify-platform-packages --tag-libc --target 14.19.1 && prebuildify-platform-packages --napi --platform-packages --tag-libc --target 16.16.0", | ||
"prebuild-macos": "prebuildify-platform-packages --target 18.7.0 && prebuildify-platform-packages --napi --platform-packages --target 16.16.0", | ||
"prebuild-win32": "prebuildify-platform-packages --target 16.14.0 && prebuildify-platform-packages --target 18.7.0 && set ENABLE_V8_FUNCTIONS=false&& prebuildify-platform-packages --napi --platform-packages --target 16.16.0", | ||
"prebuild-libc-arm7": "prebuildify-platform-packages --napi --platform-packages --tag-libc --target 16.16.0", | ||
"prebuildify": "prebuildify-platform-packages --target 18.6.0", | ||
"full-publish": "cd prebuilds/win32-x64 && npm publish --tag alpha --access public && cd ../darwin-x64 && npm publish --tag alpha --access public && cd ../darwin-arm64 && npm publish --tag alpha --access public && cd ../linux-x64 && npm publish --tag alpha --access public && cd ../linux-arm64 && npm publish --tag alpha --access public && cd ../linux-arm && npm publish --tag alpha --access public && cd ../.. && npm publish --tag alpha", | ||
"full-publish": "cd prebuilds/win32-x64 && npm publish --access public && cd ../darwin-x64 && npm publish --access public && cd ../darwin-arm64 && npm publish --access public && cd ../linux-x64 && npm publish --access public && cd ../linux-arm64 && npm publish --access public && cd ../linux-arm && npm publish --access public && cd ../.. && npm publish", | ||
"recompile": "node-gyp clean && node-gyp configure && node-gyp build", | ||
@@ -77,3 +80,3 @@ "test": "mocha test/**.test.js --expose-gc --recursive && npm run test:types", | ||
"dependencies": { | ||
"msgpackr": "^1.5.4", | ||
"msgpackr": "^1.7.0-alpha1", | ||
"node-addon-api": "^4.3.0", | ||
@@ -97,5 +100,5 @@ "node-gyp-build-optional-packages": "5.0.3", | ||
"bugs": { | ||
"url": "https://github.com/DoctorEvidence/lmdb-js/issues" | ||
"url": "https://github.com/kriszyp/lmdb-js/issues" | ||
}, | ||
"homepage": "https://github.com/DoctorEvidence/lmdb-js#readme", | ||
"homepage": "https://github.com/kriszyp/lmdb-js#readme", | ||
"directories": { | ||
@@ -105,9 +108,9 @@ "test": "tests" | ||
"optionalDependencies": { | ||
"@lmdb/lmdb-darwin-arm64": "2.6.0-alpha1", | ||
"@lmdb/lmdb-darwin-x64": "2.6.0-alpha1", | ||
"@lmdb/lmdb-linux-arm": "2.6.0-alpha1", | ||
"@lmdb/lmdb-linux-arm64": "2.6.0-alpha1", | ||
"@lmdb/lmdb-linux-x64": "2.6.0-alpha1", | ||
"@lmdb/lmdb-win32-x64": "2.6.0-alpha1" | ||
"@lmdb/lmdb-darwin-arm64": "2.6.0-alpha2", | ||
"@lmdb/lmdb-darwin-x64": "2.6.0-alpha2", | ||
"@lmdb/lmdb-linux-arm": "2.6.0-alpha2", | ||
"@lmdb/lmdb-linux-arm64": "2.6.0-alpha2", | ||
"@lmdb/lmdb-linux-x64": "2.6.0-alpha2", | ||
"@lmdb/lmdb-win32-x64": "2.6.0-alpha2" | ||
} | ||
} | ||
} |
109
read.js
import { RangeIterable } from './util/RangeIterable.js'; | ||
import { getAddress, Cursor, Txn, orderedBinary, lmdbError, getByBinary, detachBuffer, setGlobalBuffer, prefetch, iterate, position as doPosition, resetTxn, getCurrentValue, getCurrentShared, getStringByBinary, globalBuffer, getSharedBuffer } from './native.js'; | ||
import { getAddress, Cursor, Txn, orderedBinary, lmdbError, getByBinary, detachBuffer, setGlobalBuffer, prefetch, iterate, position as doPosition, resetTxn, getCurrentValue, getCurrentShared, getStringByBinary, globalBuffer, getSharedBuffer, startRead } from './native.js'; | ||
import { saveKey } from './keys.js'; | ||
@@ -16,2 +16,5 @@ const ITERATOR_DONE = { done: true, value: undefined }; | ||
let unreadResolution = {}; | ||
let lastQueuedResolution, nextResolution = unreadResolution; | ||
export function addReadMethods(LMDBStore, { | ||
@@ -37,3 +40,3 @@ maxKeySize, env, keyBytes, keyBytesView, getLastVersion, getLastTxnId | ||
getBinaryFast(id, options) { | ||
let rc | ||
let rc; | ||
if (options?.txn?.address) | ||
@@ -74,4 +77,31 @@ rc = this.lastSize = getByBinary(this.dbAddress, this.writeKey(id, keyBytes, 0), options.ifNotTxnId || 0, options.txn.address); | ||
getBFAsync(id, callback, options) { | ||
saveKey(id, writeKey, {}) | ||
let txn = options?.txn || (env.writeTxn || (readTxnRenewed ? readTxn : renewReadTxn(this))); | ||
let address = recordReadInstruction(txn.address, this.db.dbi, id, this.writeKey, maxKeySize, ({ bufferId, offset, size }) => { | ||
let buffer = mmaps[bufferId]; | ||
if (!buffer) { | ||
buffer = mmaps[bufferId] = getSharedBuffer(bufferId, env.address); | ||
} | ||
callback(buffer, offset, size); | ||
}); | ||
if (address) { | ||
startRead(address, () => { | ||
resolveReads(); | ||
}); | ||
} | ||
}, | ||
getAsync(id, options, callback) { | ||
let promise; | ||
if (!callback) | ||
promise = new Promise(resolve => callback = resolve); | ||
this.getBFAsync(id, options, (buffer, offset, size) => { | ||
let bytes = new Uint8Array(buffer, offset, size); | ||
if (this.encoding == 'binary') | ||
callback(bytes); | ||
else if (this.decoder) { | ||
// the decoder potentially uses the data from the buffer in the future and needs a stable buffer | ||
callback(bytes && this.decoder.decode(bytes)); | ||
} | ||
}); | ||
return promise; | ||
}, | ||
retainBinary(buffer) { | ||
@@ -669,1 +699,74 @@ if (!buffer) | ||
} | ||
let readInstructions, uint32Instructions, instructionsDataView = { setFloat64() {}, setUint32() {} }, instructionsAddress; | ||
let savePosition = 8000; | ||
let DYNAMIC_KEY_BUFFER_SIZE = 8192; | ||
function allocateInstructionsBuffer() { | ||
readInstructions = typeof Buffer != 'undefined' ? Buffer.alloc(DYNAMIC_KEY_BUFFER_SIZE) : new Uint8Array(DYNAMIC_KEY_BUFFER_SIZE); | ||
uint32Instructions = new Uint32Array(readInstructions.buffer, 0, readInstructions.buffer.byteLength >> 2); | ||
uint32Instructions[2] = 0xf0000000; // indicates a new read task must be started | ||
instructionsAddress = readInstructions.buffer.address = getAddress(readInstructions); | ||
readInstructions.dataView = instructionsDataView = new DataView(readInstructions.buffer, readInstructions.byteOffset, readInstructions.byteLength); | ||
savePosition = 0; | ||
} | ||
export function recordReadInstruction(txnAddress, dbi, key, writeKey, maxKeySize, callback) { | ||
if (savePosition > 7800) { | ||
allocateInstructionsBuffer(); | ||
} | ||
let start = savePosition; | ||
let keyPosition = savePosition + 16; | ||
try { | ||
savePosition = key === undefined ? keyPosition : | ||
writeKey(key, readInstructions, keyPosition); | ||
} catch (error) { | ||
if (error.name == 'RangeError') { | ||
if (8180 - start < maxKeySize) { | ||
allocateInstructionsBuffer(); // try again: | ||
return recordReadInstruction(key, writeKey, saveTo, maxKeySize); | ||
} | ||
throw new Error('Key was too large, max key size is ' + maxKeySize); | ||
} else | ||
throw error; | ||
} | ||
let length = savePosition - keyPosition; | ||
if (length > maxKeySize) { | ||
savePosition = start; | ||
throw new Error('Key of size ' + length + ' was too large, max key size is ' + maxKeySize); | ||
} | ||
uint32Instructions[(start >> 2) + 3] = length; // save the length | ||
savePosition = (savePosition + 12) & 0xfffffc; | ||
nextResolution.callback = callback; | ||
nextResolution.uint32 = uint32Instructions; | ||
nextResolution.position = start >> 2; | ||
nextResolution = nextResolution.next = {}; | ||
instructionsDataView.setFloat64(start, txnAddress, true); | ||
if (Atomics.or(uint32Instructions, (start >> 2) + 2, dbi)) { | ||
return start + instructionsAddress; | ||
} | ||
// else we are writing to an active queue, don't have to start a new task | ||
} | ||
function resolveReads(async) { | ||
let instructionStatus; | ||
debugger; | ||
console.log('resolveReads', unreadResolution, (instructionStatus = unreadResolution.uint32[unreadResolution.position + 2]) & 0x1000000); | ||
while ((instructionStatus = unreadResolution.uint32[unreadResolution.position + 2]) & 0x10000000) { | ||
let size = unreadResolution.uint32[unreadResolution.position + 3]; | ||
console.log('resolved read', size); | ||
let reference; | ||
switch(instructionStatus & 0xf) { | ||
case 0: | ||
reference = { | ||
bufferId: unreadResolution.uint32[unreadResolution.position], | ||
offset: unreadResolution.uint32[unreadResolution.position + 1], | ||
size | ||
}; | ||
break; | ||
default: | ||
throw new Error('Unknown read response'); | ||
} | ||
unreadResolution.callback(reference); | ||
unreadResolution = unreadResolution.next; | ||
} | ||
} |
@@ -40,7 +40,7 @@ [![license](https://img.shields.io/badge/license-MIT-brightgreen)](LICENSE) | ||
With the default sync'ing configuration, LMDB has a crash-proof design; a machine can be turned off at any point, and data can not be corrupted unless the written data is actually changed or tampered. Writing data and waiting for confirmation that has been writted to the physical medium is critical for data integrity, but is well known to have latency (although not necessarily less efficient). However, by batching writes, when a database is under load, slower transactions enable more writes per transaction, and this library is able to drive LMDB to achieve the maximum levels of throughput with fully sync'ed operations, preserving both the durability/safety of the transactions and unparalled performance. | ||
With the default syncing configuration, LMDB has a crash-proof design; a machine can be turned off at any point, and data can not be corrupted unless the written data is actually changed or tampered. Writing data and waiting for confirmation that has been writted to the physical medium is critical for data integrity, but is well known to have latency (although not necessarily less efficient). However, by batching writes, when a database is under load, slower transactions enable more writes per transaction, and this library is able to drive LMDB to achieve the maximum levels of throughput with fully synced operations, preserving both the durability/safety of the transactions and unparalled performance. | ||
This library supports and encourages the use of conditional writes; this allows for atomic operations that are dependendent on previously read data, and most transactional types of operations can be written with an optimistic-locking based, atomic-conditional-write pattern. This allows this library to delegate writes to off-thread execution, and scale to handle concurrent execution across many processes or threads while maintaining data integrity. | ||
This library automatically handles automatically database growth, expanding file size with a smart heuristic that minimizes file fragmentation (as you would expect from a database). | ||
This library automatically handles database growth, expanding file size with a smart heuristic that minimizes file fragmentation (as you would expect from a database). | ||
@@ -73,3 +73,3 @@ This library provides optional compression using LZ4 that works in conjunction with the asynchronous writes by performing the compression in the same thread (off the main thread) that performs the writes in a transaction. LZ4 is extremely fast, and decompression can be performed at roughly 5GB/s, so excellent storage efficiency can be achieved with almost negligible performance impact. | ||
### Values | ||
You can store a wide variety of JavaScript values and data structures in this library, including objects (with arbitrary complexity), arrays, buffers, strings, numbers, etc. in your database. Even full structural cloning (with cycles) is an optionally supported. Values are stored and retrieved according the database encoding, which can be set using the `encoding` property on the database options. By default, data is stored using MessagePack, but there are several supported encodings: | ||
You can store a wide variety of JavaScript values and data structures in this library, including objects (with arbitrary complexity), arrays, buffers, strings, numbers, etc. in your database. Even full structural cloning (with cycles) is optionally supported. Values are stored and retrieved according to the database encoding, which can be set using the `encoding` property on the database options. By default, data is stored using MessagePack, but there are several supported encodings: | ||
@@ -86,3 +86,3 @@ * `msgpack` (default) - All values are stored by serializing the value as MessagePack (using the [msgpackr](https://github.com/kriszyp/msgpackr) package). Values are decoded and parsed on retrieval, so `get` and `getRange` will return the object, array, or other value that you have stored. The msgpackr package is extremely fast (usually faster than native JSON), and provides the most flexibility in storing different value types. See the Shared Structures section for how to achieve maximum efficiency with this. | ||
### Keys | ||
When using the various APIs, keys can be any JS primitive (string, number, boolean, symbol), an array of primitives, or a Buffer. Using the default `ordered-binary` conversion, primitives are translated to binary keys used by LMDB in such a way that consistent ordering is preserved. Numbers are ordered naturally, which come before strings, which are ordered lexically. The keys are stored with type information preserved. The `getRange`operations that return a set of entries will return entries with the original JS primitive values for the keys. If arrays are used as keys, they are ordering by first value in the array, with each subsequent element being a tie-breaker. Numbers are stored as doubles, with reversal of sign bit for proper ordering plus type information, so any JS number can be used as a key. For example, here are the order of some different keys: | ||
When using the various APIs, keys can be any JS primitive (string, number, boolean, symbol), an array of primitives, or a Buffer. Using the default `ordered-binary` conversion, primitives are translated to binary keys used by LMDB in such a way that consistent ordering is preserved. Numbers are ordered naturally, which come before strings, which are ordered lexically. The keys are stored with type information preserved. The `getRange`operations that return a set of entries will return entries with the original JS primitive values for the keys. If arrays are used as keys, they are ordered by first value in the array, with each subsequent element being a tie-breaker. Numbers are stored as doubles, with reversal of sign bit for proper ordering plus type information, so any JS number can be used as a key. For example, here is the order of some different keys: | ||
@@ -107,3 +107,3 @@ ```js | ||
You can override the default encoding of keys, and cause keys to be returned as binary arrays (`Buffer`s in NodeJS) using the `keyEncoding: 'binary'` database option (generally slower), use `keyEncoding: 'uint32'` for keys that are strictly 32-bit unsigned integers, or provide a custom key encoder/decoder with `keyEncoder` (see custom key encoding). | ||
You can override the default encoding of keys, and cause keys to be returned as binary arrays (`Buffer`s in NodeJS) using the `keyEncoding: 'binary'` database option (generally slower). Use `keyEncoding: 'uint32'` for keys that are strictly 32-bit unsigned integers, or provide a custom key encoder/decoder with `keyEncoder` (see custom key encoding). | ||
@@ -126,3 +126,3 @@ Once you created have a db, the following methods are available: | ||
### `db.remove(key, IfVersion?: number): Promise<boolean>` | ||
This will delete the entry at the specified key. This functions like `put`, with the same optional conditional version. This is batched along with put operations, and returns a promise indicating the success of the operation. | ||
This will delete the entry at the specified key. This functions is similar to `put`, with the same optional conditional version. This is batched along with put operations, and returns a promise indicating the success of the operation. | ||
@@ -245,3 +245,3 @@ Again, if this is performed inside a transation, the removal will be performed in the current transaction. | ||
You can optionally provide a second argument with the same `options` that `getRange` handles. You can provide a `start` and/or `end` values, which will be define the starting value and ending value for the range of values to return for the key: | ||
You can optionally provide a second argument with the same `options` that `getRange` handles. You can provide a `start` and/or `end` values, which will define the starting value and ending value for the range of values to return for the key: | ||
@@ -255,3 +255,3 @@ ```js | ||
### `db.getKeys(options: RangeOptions): Iterable<any>` | ||
This behaves like `getRange`, but only returns the keys. If this is duplicate key database, each key is only returned once (even if it has multiple values/entries). | ||
This behaves like `getRange`, but only returns the keys. If this is a duplicate key database, each key is only returned once (even if it has multiple values/entries). | ||
@@ -258,0 +258,0 @@ ### `RangeOptions` |
@@ -0,0 +0,0 @@ export default [ |
@@ -0,0 +0,0 @@ # Security Policy |
@@ -0,0 +0,0 @@ export function when(promise, callback, errback) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
2282749
119
5699
2
+ Added@lmdb/lmdb-darwin-arm64@2.6.0-alpha2(transitive)
+ Added@lmdb/lmdb-darwin-x64@2.6.0-alpha2(transitive)
+ Added@lmdb/lmdb-linux-arm@2.6.0-alpha2(transitive)
+ Added@lmdb/lmdb-linux-arm64@2.6.0-alpha2(transitive)
+ Added@lmdb/lmdb-linux-x64@2.6.0-alpha2(transitive)
+ Added@lmdb/lmdb-win32-x64@2.6.0-alpha2(transitive)
- Removed@lmdb/lmdb-darwin-arm64@2.6.0-alpha1(transitive)
- Removed@lmdb/lmdb-darwin-x64@2.6.0-alpha1(transitive)
- Removed@lmdb/lmdb-linux-arm@2.6.0-alpha1(transitive)
- Removed@lmdb/lmdb-linux-arm64@2.6.0-alpha1(transitive)
- Removed@lmdb/lmdb-linux-x64@2.6.0-alpha1(transitive)
- Removed@lmdb/lmdb-win32-x64@2.6.0-alpha1(transitive)
Updatedmsgpackr@^1.7.0-alpha1