@0q/embedded-mongodb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/index.d.ts +35 -0
- package/index.js +227 -0
- package/native.d.ts +46 -0
- package/native.js +703 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @0q/embedded-mongodb
|
|
2
|
+
|
|
3
|
+
The MongoDB Node.js driver over an embedded MongoDB engine: the real server code, running
|
|
4
|
+
inside your process against a local directory. No server, no port.
|
|
5
|
+
|
|
6
|
+
```js
|
|
7
|
+
const { MongoClient } = require('@0q/embedded-mongodb');
|
|
8
|
+
|
|
9
|
+
const client = new MongoClient('mongodb_embedded://./data');
|
|
10
|
+
const items = client.db('app').collection('items');
|
|
11
|
+
await items.insertOne({ name: 'embedded' });
|
|
12
|
+
console.log(await items.findOne());
|
|
13
|
+
await client.close();
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`MongoClient` is the driver's own class with one addition: a `mongodb_embedded://<directory>`
|
|
17
|
+
(or `mongodb+embedded://`) address opens the directory in-process instead of connecting to a
|
|
18
|
+
server. Any other address is handed to the driver untouched. The `mongodb` package is a peer
|
|
19
|
+
dependency for this class; the lower layer needs nothing:
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
const { open } = require('@0q/embedded-mongodb');
|
|
23
|
+
|
|
24
|
+
const embedded = await open('./data');
|
|
25
|
+
// embedded.uri is a mongodb:// address any driver in this process can connect to.
|
|
26
|
+
await embedded.close();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Only one engine may be open per process. Linux x64, Linux arm64 and macOS arm64 are the
|
|
30
|
+
supported platforms. Authentication, TLS, compression, sessions, transactions and change
|
|
31
|
+
streams are not supported.
|
|
32
|
+
|
|
33
|
+
Part of [embedded-mongo](https://github.com/jeroenvervaeke/embedded-mongo), which has the full
|
|
34
|
+
documentation, the Python binding and the engine itself. Licensed under the SSPL-1.0, as
|
|
35
|
+
MongoDB is.
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MongoClient as DriverMongoClient } from 'mongodb';
|
|
2
|
+
|
|
3
|
+
export { Engine, RoundTrip } from './native';
|
|
4
|
+
import type { Engine } from './native';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The database directory an embedded URI (`mongodb_embedded://<dir>` or
|
|
8
|
+
* `mongodb+embedded://<dir>`) names, or `undefined` if this is not an embedded URI. Throws if
|
|
9
|
+
* the URI carries anything but a directory.
|
|
10
|
+
*/
|
|
11
|
+
export declare function pathFromUri(uri: unknown): string | undefined;
|
|
12
|
+
|
|
13
|
+
/** An open data directory and the in-process listener serving it. */
|
|
14
|
+
export declare class EmbeddedMongodb {
|
|
15
|
+
/** A `mongodb://` URI the driver can connect to. */
|
|
16
|
+
readonly uri: string;
|
|
17
|
+
readonly socketPath: string;
|
|
18
|
+
readonly engine: Engine;
|
|
19
|
+
/** Stops accepting connections, then closes the engine once every command in flight is done. */
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
/** `close` for a caller with no loop to await on. */
|
|
22
|
+
closeSync(): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Opens `directory`, creating it if needed, and starts serving it. */
|
|
26
|
+
export declare function open(directory: string): Promise<EmbeddedMongodb>;
|
|
27
|
+
|
|
28
|
+
/** `open` for a caller with no loop to await on. Blocks for the length of the open. */
|
|
29
|
+
export declare function openSync(directory: string): EmbeddedMongodb;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The driver's `MongoClient`, accepting embedded URIs as well as the driver's own. Needs the
|
|
33
|
+
* `mongodb` package installed; everything else here works without it.
|
|
34
|
+
*/
|
|
35
|
+
export declare const MongoClient: typeof DriverMongoClient;
|
package/index.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// The Node.js driver speaks OP_MSG to a socket, so the engine is given one: a listener on a
|
|
4
|
+
// Unix socket in a private temporary directory, inside this process, that hands every message
|
|
5
|
+
// it reads to the engine and writes the reply back. Nothing of the driver's is replaced or
|
|
6
|
+
// reached into, which is what keeps this working across driver versions -- the driver sees a
|
|
7
|
+
// standalone server at a socket path, and that is all it needs to see.
|
|
8
|
+
|
|
9
|
+
const fs = require('node:fs');
|
|
10
|
+
const net = require('node:net');
|
|
11
|
+
const os = require('node:os');
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
|
|
14
|
+
const { Engine } = require('./native');
|
|
15
|
+
|
|
16
|
+
const SCHEMES = ['mongodb+embedded://', 'mongodb_embedded://'];
|
|
17
|
+
const OP_REPLY = 1;
|
|
18
|
+
const OP_MSG = 2013;
|
|
19
|
+
const HEADER_LENGTH = 16;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The database directory an embedded URI names, or `undefined` if this is not an embedded URI.
|
|
23
|
+
* Answering `undefined` rather than throwing is what lets one client class serve both kinds of
|
|
24
|
+
* address: anything this does not recognise is passed to the driver untouched.
|
|
25
|
+
*/
|
|
26
|
+
function pathFromUri(uri) {
|
|
27
|
+
if (typeof uri !== 'string') return undefined;
|
|
28
|
+
for (const scheme of SCHEMES) {
|
|
29
|
+
if (!uri.startsWith(scheme)) continue;
|
|
30
|
+
const directory = uri.slice(scheme.length);
|
|
31
|
+
if (!directory || directory.includes('?') || directory.includes('#')) {
|
|
32
|
+
throw new Error('embedded MongoDB URI must contain only a database directory');
|
|
33
|
+
}
|
|
34
|
+
return decodeURIComponent(directory);
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** An open directory and the listener serving it. `uri` is what to hand the driver. */
|
|
40
|
+
class EmbeddedMongodb {
|
|
41
|
+
#engine;
|
|
42
|
+
#server;
|
|
43
|
+
#sockets = new Set();
|
|
44
|
+
#directory;
|
|
45
|
+
#closed = false;
|
|
46
|
+
|
|
47
|
+
constructor(engine) {
|
|
48
|
+
this.#engine = engine;
|
|
49
|
+
// mkdtemp creates the directory 0700, so the socket is reachable by this user alone.
|
|
50
|
+
this.#directory = fs.mkdtempSync(path.join(os.tmpdir(), 'embedded-mongodb-'));
|
|
51
|
+
this.socketPath = path.join(this.#directory, 'mongodb.sock');
|
|
52
|
+
this.uri = `mongodb://${encodeURIComponent(this.socketPath)}/?directConnection=true`;
|
|
53
|
+
this.#server = net.createServer((socket) => {
|
|
54
|
+
this.#sockets.add(socket);
|
|
55
|
+
socket.on('close', () => this.#sockets.delete(socket));
|
|
56
|
+
serve(engine, socket);
|
|
57
|
+
});
|
|
58
|
+
// Binding a Unix socket happens synchronously inside listen(), so the path exists and
|
|
59
|
+
// accepts connections by the time this returns; only the 'listening' event is deferred.
|
|
60
|
+
this.#server.listen(this.socketPath);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
get engine() {
|
|
64
|
+
return this.#engine;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Stops accepting connections, then closes the engine once every command in flight is done. */
|
|
68
|
+
async close() {
|
|
69
|
+
if (this.#closed) return;
|
|
70
|
+
this.#closed = true;
|
|
71
|
+
await new Promise((resolve) => {
|
|
72
|
+
this.#server.close(() => resolve());
|
|
73
|
+
for (const socket of this.#sockets) socket.destroy();
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
await this.#engine.close();
|
|
77
|
+
} finally {
|
|
78
|
+
fs.rmSync(this.#directory, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** `close` for a caller with no loop to await on, such as a constructor undoing its open. */
|
|
83
|
+
closeSync() {
|
|
84
|
+
if (this.#closed) return;
|
|
85
|
+
this.#closed = true;
|
|
86
|
+
for (const socket of this.#sockets) socket.destroy();
|
|
87
|
+
this.#server.close();
|
|
88
|
+
try {
|
|
89
|
+
this.#engine.closeSync();
|
|
90
|
+
} finally {
|
|
91
|
+
fs.rmSync(this.#directory, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Opens `directory` -- creating it if needed -- and starts serving it. */
|
|
97
|
+
async function open(directory) {
|
|
98
|
+
return new EmbeddedMongodb(await Engine.open(directory));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** `open` for a caller with no loop to await on. Blocks for the length of the open. */
|
|
102
|
+
function openSync(directory) {
|
|
103
|
+
return new EmbeddedMongodb(Engine.openSync(directory));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* One connection. Messages are answered in the order they arrive, which is the order the
|
|
108
|
+
* driver awaits them in: it never pipelines on one connection, and runs commands in parallel
|
|
109
|
+
* by opening more connections -- each of which lands here separately, and reaches the engine's
|
|
110
|
+
* strand pool alongside the others.
|
|
111
|
+
*/
|
|
112
|
+
function serve(engine, socket) {
|
|
113
|
+
let pending = Buffer.alloc(0);
|
|
114
|
+
let queue = Promise.resolve();
|
|
115
|
+
let replyId = 0;
|
|
116
|
+
|
|
117
|
+
const answer = async (message) => {
|
|
118
|
+
const { requestId, moreToCome, legacy, response } = await engine.roundTrip(message);
|
|
119
|
+
if (moreToCome || socket.destroyed) return;
|
|
120
|
+
const frame = legacy ? replyFrame(response) : msgFrame(response);
|
|
121
|
+
frame.writeInt32LE(frame.length, 0);
|
|
122
|
+
frame.writeInt32LE(++replyId, 4);
|
|
123
|
+
frame.writeInt32LE(requestId, 8);
|
|
124
|
+
socket.write(frame);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
socket.on('data', (chunk) => {
|
|
128
|
+
pending = pending.length === 0 ? chunk : Buffer.concat([pending, chunk]);
|
|
129
|
+
while (pending.length >= 4) {
|
|
130
|
+
const length = pending.readInt32LE(0);
|
|
131
|
+
if (length < HEADER_LENGTH) {
|
|
132
|
+
socket.destroy(new Error(`invalid wire message length ${length}`));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (pending.length < length) break;
|
|
136
|
+
const message = pending.subarray(0, length);
|
|
137
|
+
pending = pending.subarray(length);
|
|
138
|
+
// A failure here is the connection's, as it would be on a real socket: the driver sees
|
|
139
|
+
// it dropped, with the reason, rather than a reply it cannot match to a request.
|
|
140
|
+
queue = queue.then(() => answer(message)).catch((error) => socket.destroy(error));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// The driver closes connections it is done with, and destroys them on error; neither is
|
|
144
|
+
// anything this side needs to act on beyond the 'close' bookkeeping above.
|
|
145
|
+
socket.on('error', () => {});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** An OP_MSG carrying one body section. The header's length and ids are filled in by the caller. */
|
|
149
|
+
function msgFrame(body) {
|
|
150
|
+
const frame = Buffer.allocUnsafe(HEADER_LENGTH + 5 + body.length);
|
|
151
|
+
frame.writeInt32LE(OP_MSG, 12);
|
|
152
|
+
frame.writeUInt32LE(0, 16); // flag bits: a plain reply, nothing more to come
|
|
153
|
+
frame.writeUInt8(0, 20); // section kind: body
|
|
154
|
+
body.copy(frame, HEADER_LENGTH + 5);
|
|
155
|
+
return frame;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** An OP_REPLY carrying one document: what an OP_QUERY handshake is answered with. */
|
|
159
|
+
function replyFrame(body) {
|
|
160
|
+
const frame = Buffer.allocUnsafe(HEADER_LENGTH + 20 + body.length);
|
|
161
|
+
frame.writeInt32LE(OP_REPLY, 12);
|
|
162
|
+
frame.writeInt32LE(0, 16); // response flags
|
|
163
|
+
frame.writeBigInt64LE(0n, 20); // cursor id
|
|
164
|
+
frame.writeInt32LE(0, 28); // starting from
|
|
165
|
+
frame.writeInt32LE(1, 32); // number returned
|
|
166
|
+
body.copy(frame, HEADER_LENGTH + 20);
|
|
167
|
+
return frame;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* The driver's `MongoClient`, with embedded URIs routed to the in-process engine. Built on
|
|
172
|
+
* first use rather than at load, so the package loads -- and `open` works -- without the
|
|
173
|
+
* driver installed.
|
|
174
|
+
*/
|
|
175
|
+
let client;
|
|
176
|
+
function mongoClient() {
|
|
177
|
+
if (client) return client;
|
|
178
|
+
let driver;
|
|
179
|
+
try {
|
|
180
|
+
driver = require('mongodb');
|
|
181
|
+
} catch (error) {
|
|
182
|
+
throw new Error('MongoClient needs the mongodb package installed alongside @0q/embedded-mongodb', {
|
|
183
|
+
cause: error,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
client = class MongoClient extends driver.MongoClient {
|
|
187
|
+
#embedded;
|
|
188
|
+
|
|
189
|
+
constructor(uri, options) {
|
|
190
|
+
const directory = pathFromUri(uri);
|
|
191
|
+
if (directory === undefined) {
|
|
192
|
+
super(uri, options);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Synchronously, because this is a constructor in the driver's API: the engine has to be
|
|
196
|
+
// serving by the time `connect` can be called, and there is nothing here to await.
|
|
197
|
+
const embedded = openSync(directory);
|
|
198
|
+
try {
|
|
199
|
+
super(embedded.uri, options);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
embedded.closeSync();
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
this.#embedded = embedded;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async close(force) {
|
|
208
|
+
try {
|
|
209
|
+
await super.close(force);
|
|
210
|
+
} finally {
|
|
211
|
+
await this.#embedded?.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
return client;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
module.exports = {
|
|
219
|
+
Engine,
|
|
220
|
+
EmbeddedMongodb,
|
|
221
|
+
open,
|
|
222
|
+
openSync,
|
|
223
|
+
pathFromUri,
|
|
224
|
+
get MongoClient() {
|
|
225
|
+
return mongoClient();
|
|
226
|
+
},
|
|
227
|
+
};
|
package/native.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* auto-generated by NAPI-RS */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* An open data directory. One per process: the engine keeps a single runtime, and opening a
|
|
5
|
+
* second directory before the first is closed is refused with a message saying so.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Engine {
|
|
8
|
+
/**
|
|
9
|
+
* Opens the directory, creating it if it does not exist. Also runs the one-time index
|
|
10
|
+
* repair pass over a directory an older build damaged, which is a scan of every
|
|
11
|
+
* collection in it -- the longest thing this package ever does.
|
|
12
|
+
*/
|
|
13
|
+
static open(path: string): Promise<Engine>
|
|
14
|
+
/**
|
|
15
|
+
* [`Engine::open`] for a caller with no loop to await on: `new MongoClient(...)` is a
|
|
16
|
+
* constructor in the driver's API, and the engine has to be up before it returns.
|
|
17
|
+
*/
|
|
18
|
+
static openSync(path: string): Engine
|
|
19
|
+
/**
|
|
20
|
+
* Runs one OP_MSG and answers the reply. Commands from other connections run alongside
|
|
21
|
+
* this one -- the read guard is shared -- and only [`Engine::close`] excludes them.
|
|
22
|
+
*/
|
|
23
|
+
roundTrip(message: Buffer): Promise<RoundTrip>
|
|
24
|
+
/**
|
|
25
|
+
* Closes the engine, waiting for the commands other connections are still running. The
|
|
26
|
+
* write guard is a temporary of the first statement, so the engine's own shutdown runs
|
|
27
|
+
* with the lock released, and a command arriving meanwhile is told the engine is closed.
|
|
28
|
+
*/
|
|
29
|
+
close(): Promise<void>
|
|
30
|
+
/**
|
|
31
|
+
* [`Engine::close`] for the one caller with no loop to await on: `new MongoClient(...)`
|
|
32
|
+
* undoing its own open when the rest of the constructor fails. Leaving the engine open
|
|
33
|
+
* there would cost the process its one runtime, and every later open would be refused.
|
|
34
|
+
*/
|
|
35
|
+
closeSync(): void
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** One reply, alongside what the listener needs to frame it. */
|
|
39
|
+
export interface RoundTrip {
|
|
40
|
+
requestId: number
|
|
41
|
+
/** The request's flag: a driver that set it wants no reply written. */
|
|
42
|
+
moreToCome: boolean
|
|
43
|
+
/** The request was an OP_QUERY, so the reply has to be framed as an OP_REPLY. */
|
|
44
|
+
legacy: boolean
|
|
45
|
+
response: Buffer
|
|
46
|
+
}
|
package/native.js
ADDED
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
// prettier-ignore
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
/* auto-generated by NAPI-RS */
|
|
5
|
+
|
|
6
|
+
const { readFileSync } = require('fs')
|
|
7
|
+
let nativeBinding = null
|
|
8
|
+
const loadErrors = []
|
|
9
|
+
|
|
10
|
+
const isMusl = () => {
|
|
11
|
+
let musl = false
|
|
12
|
+
if (process.platform === 'linux') {
|
|
13
|
+
musl = isMuslFromFilesystem()
|
|
14
|
+
if (musl === null) {
|
|
15
|
+
musl = isMuslFromReport()
|
|
16
|
+
}
|
|
17
|
+
if (musl === null) {
|
|
18
|
+
musl = isMuslFromChildProcess()
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return musl
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
|
|
25
|
+
|
|
26
|
+
const isMuslFromFilesystem = () => {
|
|
27
|
+
try {
|
|
28
|
+
return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
|
|
29
|
+
} catch {
|
|
30
|
+
return null
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const isMuslFromReport = () => {
|
|
35
|
+
let report = null
|
|
36
|
+
if (process.report && typeof process.report.getReport === 'function') {
|
|
37
|
+
process.report.excludeNetwork = true
|
|
38
|
+
report = process.report.getReport()
|
|
39
|
+
}
|
|
40
|
+
if (!report) {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
if (report.header && report.header.glibcVersionRuntime) {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(report.sharedObjects)) {
|
|
47
|
+
if (report.sharedObjects.some(isFileMusl)) {
|
|
48
|
+
return true
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const isMuslFromChildProcess = () => {
|
|
55
|
+
try {
|
|
56
|
+
return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
|
|
57
|
+
} catch (e) {
|
|
58
|
+
// If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function requireNative() {
|
|
64
|
+
if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
|
|
65
|
+
try {
|
|
66
|
+
return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
|
|
67
|
+
} catch (err) {
|
|
68
|
+
loadErrors.push(err)
|
|
69
|
+
}
|
|
70
|
+
} else if (process.platform === 'android') {
|
|
71
|
+
if (process.arch === 'arm64') {
|
|
72
|
+
try {
|
|
73
|
+
return require('./embedded-mongodb.android-arm64.node')
|
|
74
|
+
} catch (e) {
|
|
75
|
+
loadErrors.push(e)
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const binding = require('@0q/embedded-mongodb-android-arm64')
|
|
79
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-android-arm64/package.json').version
|
|
80
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
81
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
82
|
+
}
|
|
83
|
+
return binding
|
|
84
|
+
} catch (e) {
|
|
85
|
+
loadErrors.push(e)
|
|
86
|
+
}
|
|
87
|
+
} else if (process.arch === 'arm') {
|
|
88
|
+
try {
|
|
89
|
+
return require('./embedded-mongodb.android-arm-eabi.node')
|
|
90
|
+
} catch (e) {
|
|
91
|
+
loadErrors.push(e)
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const binding = require('@0q/embedded-mongodb-android-arm-eabi')
|
|
95
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-android-arm-eabi/package.json').version
|
|
96
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
97
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
98
|
+
}
|
|
99
|
+
return binding
|
|
100
|
+
} catch (e) {
|
|
101
|
+
loadErrors.push(e)
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
|
|
105
|
+
}
|
|
106
|
+
} else if (process.platform === 'win32') {
|
|
107
|
+
if (process.arch === 'x64') {
|
|
108
|
+
if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
|
|
109
|
+
try {
|
|
110
|
+
return require('./embedded-mongodb.win32-x64-gnu.node')
|
|
111
|
+
} catch (e) {
|
|
112
|
+
loadErrors.push(e)
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const binding = require('@0q/embedded-mongodb-win32-x64-gnu')
|
|
116
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-win32-x64-gnu/package.json').version
|
|
117
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
118
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
119
|
+
}
|
|
120
|
+
return binding
|
|
121
|
+
} catch (e) {
|
|
122
|
+
loadErrors.push(e)
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
try {
|
|
126
|
+
return require('./embedded-mongodb.win32-x64-msvc.node')
|
|
127
|
+
} catch (e) {
|
|
128
|
+
loadErrors.push(e)
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const binding = require('@0q/embedded-mongodb-win32-x64-msvc')
|
|
132
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-win32-x64-msvc/package.json').version
|
|
133
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
134
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
135
|
+
}
|
|
136
|
+
return binding
|
|
137
|
+
} catch (e) {
|
|
138
|
+
loadErrors.push(e)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
} else if (process.arch === 'ia32') {
|
|
142
|
+
try {
|
|
143
|
+
return require('./embedded-mongodb.win32-ia32-msvc.node')
|
|
144
|
+
} catch (e) {
|
|
145
|
+
loadErrors.push(e)
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const binding = require('@0q/embedded-mongodb-win32-ia32-msvc')
|
|
149
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-win32-ia32-msvc/package.json').version
|
|
150
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
151
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
152
|
+
}
|
|
153
|
+
return binding
|
|
154
|
+
} catch (e) {
|
|
155
|
+
loadErrors.push(e)
|
|
156
|
+
}
|
|
157
|
+
} else if (process.arch === 'arm64') {
|
|
158
|
+
try {
|
|
159
|
+
return require('./embedded-mongodb.win32-arm64-msvc.node')
|
|
160
|
+
} catch (e) {
|
|
161
|
+
loadErrors.push(e)
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const binding = require('@0q/embedded-mongodb-win32-arm64-msvc')
|
|
165
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-win32-arm64-msvc/package.json').version
|
|
166
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
167
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
168
|
+
}
|
|
169
|
+
return binding
|
|
170
|
+
} catch (e) {
|
|
171
|
+
loadErrors.push(e)
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
|
|
175
|
+
}
|
|
176
|
+
} else if (process.platform === 'darwin') {
|
|
177
|
+
try {
|
|
178
|
+
return require('./embedded-mongodb.darwin-universal.node')
|
|
179
|
+
} catch (e) {
|
|
180
|
+
loadErrors.push(e)
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const binding = require('@0q/embedded-mongodb-darwin-universal')
|
|
184
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-darwin-universal/package.json').version
|
|
185
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
186
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
187
|
+
}
|
|
188
|
+
return binding
|
|
189
|
+
} catch (e) {
|
|
190
|
+
loadErrors.push(e)
|
|
191
|
+
}
|
|
192
|
+
if (process.arch === 'x64') {
|
|
193
|
+
try {
|
|
194
|
+
return require('./embedded-mongodb.darwin-x64.node')
|
|
195
|
+
} catch (e) {
|
|
196
|
+
loadErrors.push(e)
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const binding = require('@0q/embedded-mongodb-darwin-x64')
|
|
200
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-darwin-x64/package.json').version
|
|
201
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
202
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
203
|
+
}
|
|
204
|
+
return binding
|
|
205
|
+
} catch (e) {
|
|
206
|
+
loadErrors.push(e)
|
|
207
|
+
}
|
|
208
|
+
} else if (process.arch === 'arm64') {
|
|
209
|
+
try {
|
|
210
|
+
return require('./embedded-mongodb.darwin-arm64.node')
|
|
211
|
+
} catch (e) {
|
|
212
|
+
loadErrors.push(e)
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const binding = require('@0q/embedded-mongodb-darwin-arm64')
|
|
216
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-darwin-arm64/package.json').version
|
|
217
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
218
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
219
|
+
}
|
|
220
|
+
return binding
|
|
221
|
+
} catch (e) {
|
|
222
|
+
loadErrors.push(e)
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
|
|
226
|
+
}
|
|
227
|
+
} else if (process.platform === 'freebsd') {
|
|
228
|
+
if (process.arch === 'x64') {
|
|
229
|
+
try {
|
|
230
|
+
return require('./embedded-mongodb.freebsd-x64.node')
|
|
231
|
+
} catch (e) {
|
|
232
|
+
loadErrors.push(e)
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const binding = require('@0q/embedded-mongodb-freebsd-x64')
|
|
236
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-freebsd-x64/package.json').version
|
|
237
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
238
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
239
|
+
}
|
|
240
|
+
return binding
|
|
241
|
+
} catch (e) {
|
|
242
|
+
loadErrors.push(e)
|
|
243
|
+
}
|
|
244
|
+
} else if (process.arch === 'arm64') {
|
|
245
|
+
try {
|
|
246
|
+
return require('./embedded-mongodb.freebsd-arm64.node')
|
|
247
|
+
} catch (e) {
|
|
248
|
+
loadErrors.push(e)
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const binding = require('@0q/embedded-mongodb-freebsd-arm64')
|
|
252
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-freebsd-arm64/package.json').version
|
|
253
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
254
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
255
|
+
}
|
|
256
|
+
return binding
|
|
257
|
+
} catch (e) {
|
|
258
|
+
loadErrors.push(e)
|
|
259
|
+
}
|
|
260
|
+
} else {
|
|
261
|
+
loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
|
|
262
|
+
}
|
|
263
|
+
} else if (process.platform === 'linux') {
|
|
264
|
+
if (process.arch === 'x64') {
|
|
265
|
+
if (isMusl()) {
|
|
266
|
+
try {
|
|
267
|
+
return require('./embedded-mongodb.linux-x64-musl.node')
|
|
268
|
+
} catch (e) {
|
|
269
|
+
loadErrors.push(e)
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const binding = require('@0q/embedded-mongodb-linux-x64-musl')
|
|
273
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-x64-musl/package.json').version
|
|
274
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
275
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
276
|
+
}
|
|
277
|
+
return binding
|
|
278
|
+
} catch (e) {
|
|
279
|
+
loadErrors.push(e)
|
|
280
|
+
}
|
|
281
|
+
} else {
|
|
282
|
+
try {
|
|
283
|
+
return require('./embedded-mongodb.linux-x64-gnu.node')
|
|
284
|
+
} catch (e) {
|
|
285
|
+
loadErrors.push(e)
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const binding = require('@0q/embedded-mongodb-linux-x64-gnu')
|
|
289
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-x64-gnu/package.json').version
|
|
290
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
291
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
292
|
+
}
|
|
293
|
+
return binding
|
|
294
|
+
} catch (e) {
|
|
295
|
+
loadErrors.push(e)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
} else if (process.arch === 'arm64') {
|
|
299
|
+
if (isMusl()) {
|
|
300
|
+
try {
|
|
301
|
+
return require('./embedded-mongodb.linux-arm64-musl.node')
|
|
302
|
+
} catch (e) {
|
|
303
|
+
loadErrors.push(e)
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
const binding = require('@0q/embedded-mongodb-linux-arm64-musl')
|
|
307
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-arm64-musl/package.json').version
|
|
308
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
309
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
310
|
+
}
|
|
311
|
+
return binding
|
|
312
|
+
} catch (e) {
|
|
313
|
+
loadErrors.push(e)
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
try {
|
|
317
|
+
return require('./embedded-mongodb.linux-arm64-gnu.node')
|
|
318
|
+
} catch (e) {
|
|
319
|
+
loadErrors.push(e)
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
const binding = require('@0q/embedded-mongodb-linux-arm64-gnu')
|
|
323
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-arm64-gnu/package.json').version
|
|
324
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
325
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
326
|
+
}
|
|
327
|
+
return binding
|
|
328
|
+
} catch (e) {
|
|
329
|
+
loadErrors.push(e)
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
} else if (process.arch === 'arm') {
|
|
333
|
+
if (isMusl()) {
|
|
334
|
+
try {
|
|
335
|
+
return require('./embedded-mongodb.linux-arm-musleabihf.node')
|
|
336
|
+
} catch (e) {
|
|
337
|
+
loadErrors.push(e)
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
const binding = require('@0q/embedded-mongodb-linux-arm-musleabihf')
|
|
341
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-arm-musleabihf/package.json').version
|
|
342
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
343
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
344
|
+
}
|
|
345
|
+
return binding
|
|
346
|
+
} catch (e) {
|
|
347
|
+
loadErrors.push(e)
|
|
348
|
+
}
|
|
349
|
+
} else {
|
|
350
|
+
try {
|
|
351
|
+
return require('./embedded-mongodb.linux-arm-gnueabihf.node')
|
|
352
|
+
} catch (e) {
|
|
353
|
+
loadErrors.push(e)
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
const binding = require('@0q/embedded-mongodb-linux-arm-gnueabihf')
|
|
357
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-arm-gnueabihf/package.json').version
|
|
358
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
359
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
360
|
+
}
|
|
361
|
+
return binding
|
|
362
|
+
} catch (e) {
|
|
363
|
+
loadErrors.push(e)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
} else if (process.arch === 'loong64') {
|
|
367
|
+
if (isMusl()) {
|
|
368
|
+
try {
|
|
369
|
+
return require('./embedded-mongodb.linux-loong64-musl.node')
|
|
370
|
+
} catch (e) {
|
|
371
|
+
loadErrors.push(e)
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
const binding = require('@0q/embedded-mongodb-linux-loong64-musl')
|
|
375
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-loong64-musl/package.json').version
|
|
376
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
377
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
378
|
+
}
|
|
379
|
+
return binding
|
|
380
|
+
} catch (e) {
|
|
381
|
+
loadErrors.push(e)
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
try {
|
|
385
|
+
return require('./embedded-mongodb.linux-loong64-gnu.node')
|
|
386
|
+
} catch (e) {
|
|
387
|
+
loadErrors.push(e)
|
|
388
|
+
}
|
|
389
|
+
try {
|
|
390
|
+
const binding = require('@0q/embedded-mongodb-linux-loong64-gnu')
|
|
391
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-loong64-gnu/package.json').version
|
|
392
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
393
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
394
|
+
}
|
|
395
|
+
return binding
|
|
396
|
+
} catch (e) {
|
|
397
|
+
loadErrors.push(e)
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
} else if (process.arch === 'riscv64') {
|
|
401
|
+
if (isMusl()) {
|
|
402
|
+
try {
|
|
403
|
+
return require('./embedded-mongodb.linux-riscv64-musl.node')
|
|
404
|
+
} catch (e) {
|
|
405
|
+
loadErrors.push(e)
|
|
406
|
+
}
|
|
407
|
+
try {
|
|
408
|
+
const binding = require('@0q/embedded-mongodb-linux-riscv64-musl')
|
|
409
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-riscv64-musl/package.json').version
|
|
410
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
411
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
412
|
+
}
|
|
413
|
+
return binding
|
|
414
|
+
} catch (e) {
|
|
415
|
+
loadErrors.push(e)
|
|
416
|
+
}
|
|
417
|
+
} else {
|
|
418
|
+
try {
|
|
419
|
+
return require('./embedded-mongodb.linux-riscv64-gnu.node')
|
|
420
|
+
} catch (e) {
|
|
421
|
+
loadErrors.push(e)
|
|
422
|
+
}
|
|
423
|
+
try {
|
|
424
|
+
const binding = require('@0q/embedded-mongodb-linux-riscv64-gnu')
|
|
425
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-riscv64-gnu/package.json').version
|
|
426
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
427
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
428
|
+
}
|
|
429
|
+
return binding
|
|
430
|
+
} catch (e) {
|
|
431
|
+
loadErrors.push(e)
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
} else if (process.arch === 'ppc64') {
|
|
435
|
+
try {
|
|
436
|
+
return require('./embedded-mongodb.linux-ppc64-gnu.node')
|
|
437
|
+
} catch (e) {
|
|
438
|
+
loadErrors.push(e)
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
const binding = require('@0q/embedded-mongodb-linux-ppc64-gnu')
|
|
442
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-ppc64-gnu/package.json').version
|
|
443
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
444
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
445
|
+
}
|
|
446
|
+
return binding
|
|
447
|
+
} catch (e) {
|
|
448
|
+
loadErrors.push(e)
|
|
449
|
+
}
|
|
450
|
+
} else if (process.arch === 's390x') {
|
|
451
|
+
try {
|
|
452
|
+
return require('./embedded-mongodb.linux-s390x-gnu.node')
|
|
453
|
+
} catch (e) {
|
|
454
|
+
loadErrors.push(e)
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
const binding = require('@0q/embedded-mongodb-linux-s390x-gnu')
|
|
458
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-linux-s390x-gnu/package.json').version
|
|
459
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
460
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
461
|
+
}
|
|
462
|
+
return binding
|
|
463
|
+
} catch (e) {
|
|
464
|
+
loadErrors.push(e)
|
|
465
|
+
}
|
|
466
|
+
} else {
|
|
467
|
+
loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
|
|
468
|
+
}
|
|
469
|
+
} else if (process.platform === 'openharmony') {
|
|
470
|
+
if (process.arch === 'arm64') {
|
|
471
|
+
try {
|
|
472
|
+
return require('./embedded-mongodb.openharmony-arm64.node')
|
|
473
|
+
} catch (e) {
|
|
474
|
+
loadErrors.push(e)
|
|
475
|
+
}
|
|
476
|
+
try {
|
|
477
|
+
const binding = require('@0q/embedded-mongodb-openharmony-arm64')
|
|
478
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-openharmony-arm64/package.json').version
|
|
479
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
480
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
481
|
+
}
|
|
482
|
+
return binding
|
|
483
|
+
} catch (e) {
|
|
484
|
+
loadErrors.push(e)
|
|
485
|
+
}
|
|
486
|
+
} else if (process.arch === 'x64') {
|
|
487
|
+
try {
|
|
488
|
+
return require('./embedded-mongodb.openharmony-x64.node')
|
|
489
|
+
} catch (e) {
|
|
490
|
+
loadErrors.push(e)
|
|
491
|
+
}
|
|
492
|
+
try {
|
|
493
|
+
const binding = require('@0q/embedded-mongodb-openharmony-x64')
|
|
494
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-openharmony-x64/package.json').version
|
|
495
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
496
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
497
|
+
}
|
|
498
|
+
return binding
|
|
499
|
+
} catch (e) {
|
|
500
|
+
loadErrors.push(e)
|
|
501
|
+
}
|
|
502
|
+
} else if (process.arch === 'arm') {
|
|
503
|
+
try {
|
|
504
|
+
return require('./embedded-mongodb.openharmony-arm.node')
|
|
505
|
+
} catch (e) {
|
|
506
|
+
loadErrors.push(e)
|
|
507
|
+
}
|
|
508
|
+
try {
|
|
509
|
+
const binding = require('@0q/embedded-mongodb-openharmony-arm')
|
|
510
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-openharmony-arm/package.json').version
|
|
511
|
+
if (bindingPackageVersion !== '0.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
512
|
+
throw new Error(`Native binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
513
|
+
}
|
|
514
|
+
return binding
|
|
515
|
+
} catch (e) {
|
|
516
|
+
loadErrors.push(e)
|
|
517
|
+
}
|
|
518
|
+
} else {
|
|
519
|
+
loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
|
|
520
|
+
}
|
|
521
|
+
} else {
|
|
522
|
+
loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function createLoadErrorChain(errors) {
|
|
527
|
+
return errors.reduce((previous, current) => {
|
|
528
|
+
let message
|
|
529
|
+
try {
|
|
530
|
+
message =
|
|
531
|
+
current && typeof current.message === 'string'
|
|
532
|
+
? current.message
|
|
533
|
+
: String(current)
|
|
534
|
+
} catch {
|
|
535
|
+
message = 'Unknown error'
|
|
536
|
+
}
|
|
537
|
+
const error = new Error(message)
|
|
538
|
+
error.cause = previous
|
|
539
|
+
return error
|
|
540
|
+
}, null)
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// NAPI_RS_FORCE_WASI is a tri-state flag:
|
|
544
|
+
// unset / any other value → native binding preferred, WASI is only a fallback
|
|
545
|
+
// 'true' → prefer WASI, but retain native as a lazy fallback
|
|
546
|
+
// 'error' → require WASI without initializing a native fallback
|
|
547
|
+
// Treating any non-empty string as truthy (the historical behavior) meant
|
|
548
|
+
// NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered
|
|
549
|
+
// the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file.
|
|
550
|
+
//
|
|
551
|
+
// NAPI_RS_WASI_FLAVOR selects one exact generated flavor and implies strict
|
|
552
|
+
// WASI loading. It never crosses into another flavor or falls back to native.
|
|
553
|
+
const __napiWasiFlavors = ["wasm32-wasi"]
|
|
554
|
+
const __napiWasiFlavor = process.env.NAPI_RS_WASI_FLAVOR
|
|
555
|
+
const __napiWasiFlavorRequested =
|
|
556
|
+
typeof __napiWasiFlavor === 'string' && __napiWasiFlavor.length > 0
|
|
557
|
+
if (
|
|
558
|
+
__napiWasiFlavorRequested &&
|
|
559
|
+
__napiWasiFlavors.indexOf(__napiWasiFlavor) === -1
|
|
560
|
+
) {
|
|
561
|
+
throw new Error(
|
|
562
|
+
'Unsupported WASI flavor "' +
|
|
563
|
+
__napiWasiFlavor +
|
|
564
|
+
'". Available flavors: ' +
|
|
565
|
+
__napiWasiFlavors.join(', '),
|
|
566
|
+
)
|
|
567
|
+
}
|
|
568
|
+
const forceWasiError = process.env.NAPI_RS_FORCE_WASI === 'error'
|
|
569
|
+
const forceWasi =
|
|
570
|
+
process.env.NAPI_RS_FORCE_WASI === 'true' ||
|
|
571
|
+
forceWasiError ||
|
|
572
|
+
__napiWasiFlavorRequested
|
|
573
|
+
|
|
574
|
+
if (!forceWasi) {
|
|
575
|
+
nativeBinding = requireNative()
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (!nativeBinding || forceWasi) {
|
|
579
|
+
let wasiBinding = null
|
|
580
|
+
let wasiBindingLoaded = false
|
|
581
|
+
const wasiBindingErrors = []
|
|
582
|
+
const __napiWasiResolveCandidate = (specifier, isPackage, localArtifacts) => {
|
|
583
|
+
try {
|
|
584
|
+
require.resolve(specifier)
|
|
585
|
+
} catch (resolveError) {
|
|
586
|
+
if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
|
|
587
|
+
throw resolveError
|
|
588
|
+
}
|
|
589
|
+
if (isPackage) {
|
|
590
|
+
try {
|
|
591
|
+
require.resolve(specifier + '/package.json')
|
|
592
|
+
} catch (packageError) {
|
|
593
|
+
if (packageError && packageError.code === 'MODULE_NOT_FOUND') {
|
|
594
|
+
return resolveError
|
|
595
|
+
}
|
|
596
|
+
// An exports restriction proves the package exists even when its
|
|
597
|
+
// package.json is not public. Preserve the root resolution failure.
|
|
598
|
+
throw resolveError
|
|
599
|
+
}
|
|
600
|
+
// The package exists but its main/export target is broken.
|
|
601
|
+
throw resolveError
|
|
602
|
+
}
|
|
603
|
+
return resolveError
|
|
604
|
+
}
|
|
605
|
+
if (localArtifacts) {
|
|
606
|
+
let artifactError = null
|
|
607
|
+
for (let i = 0; i < localArtifacts.length; i++) {
|
|
608
|
+
try {
|
|
609
|
+
require.resolve(localArtifacts[i])
|
|
610
|
+
return null
|
|
611
|
+
} catch (resolveError) {
|
|
612
|
+
if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
|
|
613
|
+
throw resolveError
|
|
614
|
+
}
|
|
615
|
+
artifactError = resolveError
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
return artifactError
|
|
619
|
+
}
|
|
620
|
+
return null
|
|
621
|
+
}
|
|
622
|
+
if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === "wasm32-wasi")) {
|
|
623
|
+
let candidateError = null
|
|
624
|
+
let candidateFailed = false
|
|
625
|
+
try {
|
|
626
|
+
candidateError = __napiWasiResolveCandidate('./embedded-mongodb.wasi.cjs', false, ["./embedded-mongodb.wasm32-wasi.debug.wasm","./embedded-mongodb.wasm32-wasi.wasm"])
|
|
627
|
+
candidateFailed = candidateError !== null
|
|
628
|
+
if (!candidateFailed) {
|
|
629
|
+
wasiBinding = require('./embedded-mongodb.wasi.cjs')
|
|
630
|
+
nativeBinding = wasiBinding
|
|
631
|
+
wasiBindingLoaded = true
|
|
632
|
+
}
|
|
633
|
+
} catch (err) {
|
|
634
|
+
candidateError = err
|
|
635
|
+
candidateFailed = true
|
|
636
|
+
}
|
|
637
|
+
if (candidateFailed) {
|
|
638
|
+
wasiBindingErrors.push(candidateError)
|
|
639
|
+
loadErrors.push(candidateError)
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === "wasm32-wasi")) {
|
|
643
|
+
let candidateError = null
|
|
644
|
+
let candidateFailed = false
|
|
645
|
+
try {
|
|
646
|
+
candidateError = __napiWasiResolveCandidate('@0q/embedded-mongodb-wasm32-wasi', true, undefined)
|
|
647
|
+
candidateFailed = candidateError !== null
|
|
648
|
+
if (!candidateFailed) {
|
|
649
|
+
if (process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
|
|
650
|
+
const bindingPackageVersion = require('@0q/embedded-mongodb-wasm32-wasi/package.json').version
|
|
651
|
+
if (bindingPackageVersion !== '0.1.0') {
|
|
652
|
+
throw new Error(`WASI binding package version mismatch, expected 0.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
wasiBinding = require('@0q/embedded-mongodb-wasm32-wasi')
|
|
656
|
+
nativeBinding = wasiBinding
|
|
657
|
+
wasiBindingLoaded = true
|
|
658
|
+
}
|
|
659
|
+
} catch (err) {
|
|
660
|
+
candidateError = err
|
|
661
|
+
candidateFailed = true
|
|
662
|
+
}
|
|
663
|
+
if (candidateFailed) {
|
|
664
|
+
wasiBindingErrors.push(candidateError)
|
|
665
|
+
loadErrors.push(candidateError)
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
if (
|
|
669
|
+
!wasiBindingLoaded &&
|
|
670
|
+
forceWasi &&
|
|
671
|
+
!forceWasiError &&
|
|
672
|
+
!__napiWasiFlavorRequested
|
|
673
|
+
) {
|
|
674
|
+
nativeBinding = requireNative()
|
|
675
|
+
}
|
|
676
|
+
if ((forceWasiError || __napiWasiFlavorRequested) && !wasiBindingLoaded) {
|
|
677
|
+
const error = new Error(
|
|
678
|
+
__napiWasiFlavorRequested
|
|
679
|
+
? 'WASI binding for flavor "' + __napiWasiFlavor + '" not found'
|
|
680
|
+
: 'WASI binding not found and NAPI_RS_FORCE_WASI is set to error',
|
|
681
|
+
)
|
|
682
|
+
error.cause = createLoadErrorChain(wasiBindingErrors)
|
|
683
|
+
throw error
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
if (!nativeBinding) {
|
|
688
|
+
if (loadErrors.length > 0) {
|
|
689
|
+
const error = new Error(
|
|
690
|
+
`Cannot find native binding. ` +
|
|
691
|
+
`npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
|
|
692
|
+
'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
|
|
693
|
+
)
|
|
694
|
+
// assign instead of the `new Error(message, { cause })` options form,
|
|
695
|
+
// which Node < 16.9 silently ignores
|
|
696
|
+
error.cause = createLoadErrorChain(loadErrors)
|
|
697
|
+
throw error
|
|
698
|
+
}
|
|
699
|
+
throw new Error(`Failed to load native binding`)
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
module.exports = nativeBinding
|
|
703
|
+
module.exports.Engine = nativeBinding.Engine
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@0q/embedded-mongodb",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Run the MongoDB Node.js driver against an in-process embedded MongoDB engine",
|
|
5
|
+
"license": "SSPL-1.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/jeroenvervaeke/embedded-mongo.git",
|
|
9
|
+
"directory": "embedded-mongodb-node"
|
|
10
|
+
},
|
|
11
|
+
"main": "index.js",
|
|
12
|
+
"types": "index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"index.js",
|
|
15
|
+
"index.d.ts",
|
|
16
|
+
"native.js",
|
|
17
|
+
"native.d.ts",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">= 20"
|
|
22
|
+
},
|
|
23
|
+
"napi": {
|
|
24
|
+
"binaryName": "embedded-mongodb",
|
|
25
|
+
"targets": [
|
|
26
|
+
"x86_64-unknown-linux-gnu",
|
|
27
|
+
"aarch64-unknown-linux-gnu",
|
|
28
|
+
"aarch64-apple-darwin"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "napi build --platform --release --js native.js --dts native.d.ts && node scripts/bundle-engine.js",
|
|
33
|
+
"test": "node --test test/*.test.js"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"mongodb": ">=6"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"mongodb": {
|
|
40
|
+
"optional": true
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"optionalDependencies": {
|
|
44
|
+
"@0q/embedded-mongodb-linux-x64-gnu": "0.1.0",
|
|
45
|
+
"@0q/embedded-mongodb-linux-arm64-gnu": "0.1.0",
|
|
46
|
+
"@0q/embedded-mongodb-darwin-arm64": "0.1.0"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@napi-rs/cli": "^3.9.0",
|
|
53
|
+
"mongodb": "^7.5.0"
|
|
54
|
+
}
|
|
55
|
+
}
|