node-cqrs 1.2.0-alpha.0 → 1.2.0-alpha.2
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/CHANGELOG.md +48 -0
- package/README.md +9 -3
- package/dist/cjs/sqlite-workers/AsyncSqliteStatement.js.map +1 -1
- package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js +1 -6
- package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js.map +1 -1
- package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js +12 -29
- package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js.map +1 -1
- package/dist/cjs/sqlite-workers/protocol.js +7 -7
- package/dist/cjs/sqlite-workers/protocol.js.map +1 -1
- package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js +3 -7
- package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js.map +1 -1
- package/dist/cjs/sqlite-workers/utils/createWorkerDb.js +79 -0
- package/dist/cjs/sqlite-workers/utils/createWorkerDb.js.map +1 -0
- package/dist/cjs/sqlite-workers/utils/index.js +2 -0
- package/dist/cjs/sqlite-workers/utils/index.js.map +1 -1
- package/dist/cjs/sqlite-workers/utils/resolveCurrentFileLocationFromStack.js +12 -0
- package/dist/cjs/sqlite-workers/utils/resolveCurrentFileLocationFromStack.js.map +1 -0
- package/dist/cjs/workers/AbstractWorkerProjection.js +5 -4
- package/dist/cjs/workers/AbstractWorkerProjection.js.map +1 -1
- package/dist/cjs/workers/WorkerProxyProjection.js +21 -4
- package/dist/cjs/workers/WorkerProxyProjection.js.map +1 -1
- package/dist/esm/sqlite-workers/AsyncSqliteStatement.js.map +1 -1
- package/dist/esm/sqlite-workers/SqliteWorkerProxy.js +1 -6
- package/dist/esm/sqlite-workers/SqliteWorkerProxy.js.map +1 -1
- package/dist/esm/sqlite-workers/SqliteWorkerRunner.js +12 -25
- package/dist/esm/sqlite-workers/SqliteWorkerRunner.js.map +1 -1
- package/dist/esm/sqlite-workers/protocol.js +7 -7
- package/dist/esm/sqlite-workers/protocol.js.map +1 -1
- package/dist/esm/sqlite-workers/utils/createSqliteWorker.js +3 -7
- package/dist/esm/sqlite-workers/utils/createSqliteWorker.js.map +1 -1
- package/dist/esm/sqlite-workers/utils/createWorkerDb.js +40 -0
- package/dist/esm/sqlite-workers/utils/createWorkerDb.js.map +1 -0
- package/dist/esm/sqlite-workers/utils/index.js +2 -0
- package/dist/esm/sqlite-workers/utils/index.js.map +1 -1
- package/dist/esm/sqlite-workers/utils/resolveCurrentFileLocationFromStack.js +9 -0
- package/dist/esm/sqlite-workers/utils/resolveCurrentFileLocationFromStack.js.map +1 -0
- package/dist/esm/workers/AbstractWorkerProjection.js +5 -4
- package/dist/esm/workers/AbstractWorkerProjection.js.map +1 -1
- package/dist/esm/workers/WorkerProxyProjection.js +21 -4
- package/dist/esm/workers/WorkerProxyProjection.js.map +1 -1
- package/dist/types/sqlite-workers/AsyncSqliteStatement.d.ts +6 -4
- package/dist/types/sqlite-workers/SqliteWorkerProxy.d.ts +1 -1
- package/dist/types/sqlite-workers/SqliteWorkerRunner.d.ts +3 -1
- package/dist/types/sqlite-workers/protocol.d.ts +12 -7
- package/dist/types/sqlite-workers/utils/createSqliteWorker.d.ts +1 -5
- package/dist/types/sqlite-workers/utils/createWorkerDb.d.ts +3 -0
- package/dist/types/sqlite-workers/utils/index.d.ts +2 -0
- package/dist/types/sqlite-workers/utils/resolveCurrentFileLocationFromStack.d.ts +1 -0
- package/dist/types/workers/WorkerProxyProjection.d.ts +9 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
# [1.2.0-alpha.2](https://github.com/snatalenko/node-cqrs/compare/v1.1.0-beta.4...v1.2.0-alpha.2) (2026-05-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# [1.2.0-alpha.1](https://github.com/snatalenko/node-cqrs/compare/v1.2.0-alpha.0...v1.2.0-alpha.1) (2026-04-28)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* Allow SQLite worker connections to be created with a custom factory ([fb39cf1](https://github.com/snatalenko/node-cqrs/commit/fb39cf1e3be51c279de6571262c360bf057dea28))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# [1.2.0-alpha.0](https://github.com/snatalenko/node-cqrs/compare/v1.1.0-beta.2...v1.2.0-alpha.0) (2026-04-27)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* Add sqlite-workers submodule for async SQLite reads ([1987a40](https://github.com/snatalenko/node-cqrs/commit/1987a403fdfd38a57cf4b2c82bc79e88568bc32e))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# [1.1.0-beta.4](https://github.com/snatalenko/node-cqrs/compare/v1.1.0-beta.3...v1.1.0-beta.4) (2026-05-04)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Internal Fixes
|
|
25
|
+
|
|
26
|
+
* Allow disposing worker projection proxy more than once ([768f73a](https://github.com/snatalenko/node-cqrs/commit/768f73a28a8a1a572449122f5046c102435dd5bd))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# [1.1.0-beta.3](https://github.com/snatalenko/node-cqrs/compare/v1.2.0-alpha.1...v1.1.0-beta.3) (2026-05-04)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Changes
|
|
33
|
+
|
|
34
|
+
* Deliver events to worker in batches during restoring phase ([212e353](https://github.com/snatalenko/node-cqrs/commit/212e3535b22e6a763a7e0fd1f81036f9ef776ec0))
|
|
35
|
+
|
|
36
|
+
### Documentation
|
|
37
|
+
|
|
38
|
+
* Add index.html for publishing with gh pages ([cac88ed](https://github.com/snatalenko/node-cqrs/commit/cac88edaaef1c9457af48fd7477daf8ae624eb43))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# [1.2.0-alpha.1](https://github.com/snatalenko/node-cqrs/compare/v1.2.0-alpha.0...v1.2.0-alpha.1) (2026-04-28)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Features
|
|
45
|
+
|
|
46
|
+
* Allow SQLite worker connections to be created with a custom factory ([fb39cf1](https://github.com/snatalenko/node-cqrs/commit/fb39cf1e3be51c279de6571262c360bf057dea28))
|
|
47
|
+
|
|
48
|
+
|
|
1
49
|
# [1.2.0-alpha.0](https://github.com/snatalenko/node-cqrs/compare/v1.1.0-beta.2...v1.2.0-alpha.0) (2026-04-27)
|
|
2
50
|
|
|
3
51
|
|
package/README.md
CHANGED
|
@@ -9,11 +9,16 @@ node-cqrs
|
|
|
9
9
|
[](https://github.com/snatalenko/node-cqrs)
|
|
10
10
|
[](https://github.com/snatalenko/node-cqrs/actions/workflows/ci.yml)
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Building blocks for CQRS/ES, inspired by Lokad.CQRS.
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<img src="docs/images/logo.svg" width="250" />
|
|
16
|
+
</p>
|
|
13
17
|
|
|
14
18
|
## Features
|
|
15
19
|
|
|
16
20
|
CQRS and Event Sourcing are simple in a single process ([example](examples/user-domain-framework-free/index.ts)), but a minefield in the cloud.
|
|
21
|
+
|
|
17
22
|
node-cqrs handles the "boring but hard" distributed plumbing - concurrency, message delivery, projections, and rehydration - so you can focus on your domain logic.
|
|
18
23
|
|
|
19
24
|
- **Reliable Consistency**: Per-aggregate FIFO handling and conflict-safe writes with optimistic concurrency.
|
|
@@ -21,9 +26,9 @@ node-cqrs handles the "boring but hard" distributed plumbing - concurrency, mess
|
|
|
21
26
|
- **Fast Rehydration**: Automatic snapshotting and selective event restores.
|
|
22
27
|
- **Distributed Sagas**: Built-in event correlation and origin propagation for complex workflows.
|
|
23
28
|
- **Smart Pipelines**: Pluggable dispatching with back-pressure and concurrency limits.
|
|
24
|
-
- **Pluggable by Design**: Thin interfaces on every component - swap any piece,
|
|
29
|
+
- **Pluggable by Design**: Thin interfaces on every component - swap any piece, without patching the library or your domain code.
|
|
25
30
|
|
|
26
|
-
The heavy lifting for common stacks is done, so you can mix and match sub-modules to fit your environment:
|
|
31
|
+
The core is infrastructure-agnostic, but the heavy lifting for common stacks is done, so you can mix and match sub-modules to fit your environment:
|
|
27
32
|
|
|
28
33
|
- `node-cqrs/sqlite` – Embedded per-process event storage and/or views.
|
|
29
34
|
- `node-cqrs/mongodb` – Distributed event storage and persistent projection views for multi-process deployments.
|
|
@@ -522,6 +527,7 @@ See [examples/telemetry/index.ts](examples/telemetry/index.ts) for a full workin
|
|
|
522
527
|
- [examples/redis](examples/redis/index.ts) - Redis-backed persistent projection
|
|
523
528
|
- [examples/sagas-simple](examples/sagas-simple/index.ts) - simple saga
|
|
524
529
|
- [examples/sagas-overlaps](examples/sagas-overlaps/index.ts) - overlapping sagas, multi-step flow
|
|
530
|
+
- [examples/sqlite](examples/sqlite/index.ts) - SQLite-backed object storage view
|
|
525
531
|
- [examples/browser](examples/browser) - browser smoke test
|
|
526
532
|
- [examples/workers-projection](examples/workers-projection) - worker thread projection
|
|
527
533
|
- [examples/mongodb-eventstore](examples/mongodb-eventstore/index.ts) - MongoDB event storage with DI container and manual wiring
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncSqliteStatement.js","sourceRoot":"","sources":["../../../src/sqlite-workers/AsyncSqliteStatement.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AsyncSqliteStatement.js","sourceRoot":"","sources":["../../../src/sqlite-workers/AsyncSqliteStatement.ts"],"names":[],"mappings":";;;AAWA,MAAa,oBAAoB;IAKvB,UAAU,CAAmC;IAC7C,OAAO,CAA8B;IAE9C,YACC,SAA2C,EAC3C,MAAmC;QAEnC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAgB,MAAmD;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAoB,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,GAAG,CAAgB,MAAmD;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAA8B,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAmD;QAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;CACD;AA3BD,oDA2BC"}
|
|
@@ -36,7 +36,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.SqliteWorkerProxy = void 0;
|
|
37
37
|
const Comlink = __importStar(require("comlink"));
|
|
38
38
|
const index_ts_1 = require("./utils/index.js");
|
|
39
|
-
const SqliteWorkerRunner_ts_1 = require("./SqliteWorkerRunner.js");
|
|
40
39
|
const AsyncSqliteStatement_ts_1 = require("./AsyncSqliteStatement.js");
|
|
41
40
|
class SqliteWorkerProxy {
|
|
42
41
|
#config;
|
|
@@ -76,11 +75,7 @@ class SqliteWorkerProxy {
|
|
|
76
75
|
async assertWorker() {
|
|
77
76
|
if (this.#worker)
|
|
78
77
|
return this.#worker;
|
|
79
|
-
|
|
80
|
-
this.#workerPromise ??= (0, index_ts_1.createSqliteWorker)({
|
|
81
|
-
...dbParams,
|
|
82
|
-
sqliteWorkerRunnerLocation
|
|
83
|
-
})
|
|
78
|
+
this.#workerPromise ??= (0, index_ts_1.createSqliteWorker)(this.#config)
|
|
84
79
|
.then(worker => {
|
|
85
80
|
this.#worker = worker;
|
|
86
81
|
worker.once('error', this.handleWorkerError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteWorkerProxy.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerProxy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,iDAAmC;AAOnC,+CAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"SqliteWorkerProxy.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,20 +32,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
36
|
exports.SqliteWorkerRunner = void 0;
|
|
40
|
-
exports.resolveCurrentFileLocationFromStack = resolveCurrentFileLocationFromStack;
|
|
41
37
|
const node_worker_threads_1 = require("node:worker_threads");
|
|
42
38
|
const path = __importStar(require("node:path"));
|
|
43
|
-
const node_url_1 = require("node:url");
|
|
44
39
|
const Comlink = __importStar(require("comlink"));
|
|
45
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
46
40
|
const protocol_ts_1 = require("./protocol.js");
|
|
47
41
|
const index_ts_1 = require("./utils/index.js");
|
|
48
|
-
const index_ts_2 = require("../utils/index.js");
|
|
49
42
|
function all(statement, params) {
|
|
50
43
|
return params === undefined ? statement.all() : statement.all(params);
|
|
51
44
|
}
|
|
@@ -55,34 +48,21 @@ function get(statement, params) {
|
|
|
55
48
|
function run(statement, params) {
|
|
56
49
|
return params === undefined ? statement.run() : statement.run(params);
|
|
57
50
|
}
|
|
58
|
-
/** @internal */
|
|
59
|
-
function resolveCurrentFileLocationFromStack(stack = new Error().stack) {
|
|
60
|
-
const stackFilename = stack?.match(/\((file:\/\/[^)]+SqliteWorkerRunner\.js):\d+:\d+\)/)?.[1];
|
|
61
|
-
if (!stackFilename)
|
|
62
|
-
throw new Error('Worker location could not be resolved from Error stack, pass sqliteWorkerRunnerLocation');
|
|
63
|
-
return (0, node_url_1.fileURLToPath)(stackFilename);
|
|
64
|
-
}
|
|
65
51
|
class SqliteWorkerRunner {
|
|
66
52
|
static get location() {
|
|
67
53
|
if (typeof __filename !== 'undefined' && path.isAbsolute(__filename))
|
|
68
54
|
return __filename;
|
|
69
55
|
/* istanbul ignore next -- exercised by ESM consumers, not ts-jest's CJS transform */
|
|
70
|
-
return resolveCurrentFileLocationFromStack();
|
|
56
|
+
return (0, index_ts_1.resolveCurrentFileLocationFromStack)();
|
|
71
57
|
}
|
|
72
58
|
#db;
|
|
73
59
|
#nextStatementHandle = 1;
|
|
74
60
|
#statements = new Map();
|
|
75
|
-
|
|
76
|
-
(0,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
if (dbParams.pragmas?.length) {
|
|
82
|
-
(0, index_ts_2.assertStringArray)(dbParams.pragmas, 'dbParams.pragmas');
|
|
83
|
-
for (const pragma of dbParams.pragmas)
|
|
84
|
-
this.#db.pragma(pragma);
|
|
85
|
-
}
|
|
61
|
+
static async create(dbParams) {
|
|
62
|
+
return new SqliteWorkerRunner(await (0, index_ts_1.createWorkerDb)(dbParams));
|
|
63
|
+
}
|
|
64
|
+
constructor(db) {
|
|
65
|
+
this.#db = db;
|
|
86
66
|
}
|
|
87
67
|
all(sql, params) {
|
|
88
68
|
const statement = this.#db.prepare(sql);
|
|
@@ -123,10 +103,13 @@ class SqliteWorkerRunner {
|
|
|
123
103
|
exports.SqliteWorkerRunner = SqliteWorkerRunner;
|
|
124
104
|
/* istanbul ignore next -- this branch runs inside the spawned worker process */
|
|
125
105
|
if (node_worker_threads_1.parentPort) {
|
|
106
|
+
const port = node_worker_threads_1.parentPort;
|
|
126
107
|
if (!(0, protocol_ts_1.isSqliteWorkerData)(node_worker_threads_1.workerData))
|
|
127
108
|
throw new Error('workerData does not contain SQLite worker db parameters');
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
109
|
+
void SqliteWorkerRunner.create(node_worker_threads_1.workerData.dbConfig)
|
|
110
|
+
.then(runner => {
|
|
111
|
+
port.postMessage({ type: 'ready' });
|
|
112
|
+
Comlink.expose(runner, (0, index_ts_1.nodeEndpoint)(port));
|
|
113
|
+
});
|
|
131
114
|
}
|
|
132
115
|
//# sourceMappingURL=SqliteWorkerRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteWorkerRunner.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerRunner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SqliteWorkerRunner.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerRunner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,gDAAkC;AAClC,iDAAmC;AAEnC,+CAOuB;AACvB,+CAI0B;AAI1B,SAAS,GAAG,CAAO,SAAqC,EAAE,MAAgC;IACzF,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,GAAG,CAAO,SAAqC,EAAE,MAAgC;IACzF,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,GAAG,CAAC,SAAoB,EAAE,MAAgC;IAClE,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAa,kBAAkB;IAE9B,MAAM,KAAK,QAAQ;QAClB,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACnE,OAAO,UAAU,CAAC;QAEnB,qFAAqF;QACrF,OAAO,IAAA,8CAAmC,GAAE,CAAC;IAC9C,CAAC;IAEQ,GAAG,CAAC;IACb,oBAAoB,GAAG,CAAC,CAAC;IAChB,WAAW,GAAG,IAAI,GAAG,EAA8D,CAAC;IAE7F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAoC;QACvD,OAAO,IAAI,kBAAkB,CAAC,MAAM,IAAA,yBAAc,EAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,YAAY,EAAY;QACvB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IACf,CAAC;IAED,GAAG,CAAO,GAAW,EAAE,MAAgC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAkB,GAAG,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAO,GAAW,EAAE,MAAgC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAkB,GAAG,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,MAAgC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAW;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,gBAAgB;IAChB,WAAW,CAAO,MAAmC,EAAE,MAAgC;QACtF,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,CAAO,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,gBAAgB;IAChB,WAAW,CAAO,MAAmC,EAAE,MAAgC;QACtF,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,CAAO,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,gBAAgB;IAChB,WAAW,CAAC,MAAmC,EAAE,MAAgC;QAChF,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAO,MAAmC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS;YACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,kBAAkB,CAAC,CAAC;QAEvE,OAAO,SAAuC,CAAC;IAChD,CAAC;CACD;AAlED,gDAkEC;AAED,gFAAgF;AAChF,IAAI,gCAAU,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,gCAAU,CAAC;IAExB,IAAI,CAAC,IAAA,gCAAkB,EAAC,gCAAU,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAE5E,KAAK,kBAAkB,CAAC,MAAM,CAAC,gCAAU,CAAC,QAAQ,CAAC;SACjD,IAAI,CAAC,MAAM,CAAC,EAAE;QACd,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAA,uBAAY,EAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSqliteWorkerData = isSqliteWorkerData;
|
|
4
4
|
exports.isSqliteWorkerReadyMessage = isSqliteWorkerReadyMessage;
|
|
5
|
+
const isObject = (obj) => typeof obj === 'object'
|
|
6
|
+
&& obj !== null
|
|
7
|
+
&& !Array.isArray(obj)
|
|
8
|
+
&& !(obj instanceof Date);
|
|
5
9
|
function isSqliteWorkerData(value) {
|
|
6
|
-
return
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
typeof value.db === 'object' &&
|
|
10
|
-
value.db !== null &&
|
|
11
|
-
'location' in value.db &&
|
|
12
|
-
typeof value.db.location === 'string';
|
|
10
|
+
return isObject(value)
|
|
11
|
+
&& 'dbConfig' in value
|
|
12
|
+
&& isObject(value.dbConfig);
|
|
13
13
|
}
|
|
14
14
|
function isSqliteWorkerReadyMessage(value) {
|
|
15
15
|
return typeof value === 'object' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sqlite-workers/protocol.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sqlite-workers/protocol.ts"],"names":[],"mappings":";;AAiEA,gDAIC;AAED,gEAKC;AAjBD,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAa,EAAE,CAC5C,OAAO,GAAG,KAAK,QAAQ;OACpB,GAAG,KAAK,IAAI;OACZ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;OACnB,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;AAE3B,SAAgB,kBAAkB,CAAC,KAAc;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC;WAClB,UAAU,IAAI,KAAK;WACnB,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAAc;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC/B,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;AACzB,CAAC"}
|
|
@@ -3,13 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createSqliteWorker = createSqliteWorker;
|
|
4
4
|
const node_worker_threads_1 = require("node:worker_threads");
|
|
5
5
|
const protocol_ts_1 = require("../protocol.js");
|
|
6
|
-
const
|
|
7
|
-
async function createSqliteWorker(
|
|
8
|
-
|
|
9
|
-
if (pragmas?.length)
|
|
10
|
-
(0, assert_ts_1.assertStringArray)(pragmas, 'pragmas');
|
|
11
|
-
(0, assert_ts_1.assertString)(sqliteWorkerRunnerLocation, 'sqliteWorkerRunnerLocation');
|
|
12
|
-
const workerData = { db: { location, pragmas } };
|
|
6
|
+
const SqliteWorkerRunner_ts_1 = require("../SqliteWorkerRunner.js");
|
|
7
|
+
async function createSqliteWorker(params) {
|
|
8
|
+
const { sqliteWorkerRunnerLocation = SqliteWorkerRunner_ts_1.SqliteWorkerRunner.location, ...workerData } = params;
|
|
13
9
|
const worker = new node_worker_threads_1.Worker(sqliteWorkerRunnerLocation, { workerData });
|
|
14
10
|
await new Promise((resolve, reject) => {
|
|
15
11
|
let onError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSqliteWorker.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createSqliteWorker.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"createSqliteWorker.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createSqliteWorker.ts"],"names":[],"mappings":";;AAIA,gDA2CC;AA/CD,6DAA6C;AAC7C,gDAA0F;AAC1F,oEAA8D;AAEvD,KAAK,UAAU,kBAAkB,CAAC,MAA+B;IACvE,MAAM,EACL,0BAA0B,GAAG,0CAAkB,CAAC,QAAQ,EACxD,GAAG,UAAU,EACb,GAAG,MAAM,CAAC;IAEX,MAAM,MAAM,GAAG,IAAI,4BAAM,CAAC,0BAA0B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,OAA+B,CAAC;QACpC,IAAI,SAAqC,CAAC;QAC1C,IAAI,MAAkC,CAAC;QAEvC,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;YAChC,IAAI,CAAC,IAAA,wCAA0B,EAAC,OAAO,CAAC;gBACvC,OAAO;YAER,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;YAC1B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
39
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
40
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
41
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return path;
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.createWorkerDb = createWorkerDb;
|
|
48
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
49
|
+
const index_ts_1 = require("../../utils/index.js");
|
|
50
|
+
function resolveImportLocation(location) {
|
|
51
|
+
if (location instanceof URL)
|
|
52
|
+
/* istanbul ignore next -- file URL imports are exercised by Node workers outside ts-jest */
|
|
53
|
+
return location.href;
|
|
54
|
+
return location;
|
|
55
|
+
}
|
|
56
|
+
async function createWorkerDb(params) {
|
|
57
|
+
if ('dbFactoryLocation' in params && !!params.dbFactoryLocation) {
|
|
58
|
+
const factoryModule = await Promise.resolve(`${__rewriteRelativeImportExtension(resolveImportLocation(params.dbFactoryLocation))}`).then(s => __importStar(require(s)));
|
|
59
|
+
const createSqliteWorkerDb = factoryModule.createSqliteWorkerDb ??
|
|
60
|
+
factoryModule.default?.createSqliteWorkerDb ??
|
|
61
|
+
factoryModule.default;
|
|
62
|
+
(0, index_ts_1.assertFunction)(createSqliteWorkerDb, 'createSqliteWorkerDb');
|
|
63
|
+
return createSqliteWorkerDb(params.dbFactoryParams);
|
|
64
|
+
}
|
|
65
|
+
else if ('dbLocation' in params && !!params.dbLocation) {
|
|
66
|
+
(0, index_ts_1.assertString)(params.dbLocation, 'dbLocation');
|
|
67
|
+
const db = (0, better_sqlite3_1.default)(params.dbLocation, { readonly: true, fileMustExist: true });
|
|
68
|
+
if (params.pragmas?.length) {
|
|
69
|
+
(0, index_ts_1.assertStringArray)(params.pragmas, 'pragmas');
|
|
70
|
+
for (const pragma of params.pragmas)
|
|
71
|
+
db.pragma(pragma);
|
|
72
|
+
}
|
|
73
|
+
return db;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error('Either dbLocation or dbFactoryLocation is required');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=createWorkerDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkerDb.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createWorkerDb.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,wCA6BC;AAzCD,oEAAyD;AACzD,mDAAuF;AAGvF,SAAS,qBAAqB,CAAC,QAAsB;IACpD,IAAI,QAAQ,YAAY,GAAG;QAC1B,4FAA4F;QAC5F,OAAO,QAAQ,CAAC,IAAI,CAAC;IAEtB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,MAAkC;IACtE,IAAI,mBAAmB,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACjE,MAAM,aAAa,GAAG,0DAAa,qBAAqB,CAAC,MAAM,CAAC,iBAAiB,CAAC,wCAAC,CAAC;QACpF,MAAM,oBAAoB,GACzB,aAAa,CAAC,oBAAoB;YAClC,aAAa,CAAC,OAAO,EAAE,oBAAoB;YAC3C,aAAa,CAAC,OAAO,CAAC;QAEvB,IAAA,yBAAc,EAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QAE7D,OAAO,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC;SACI,IAAI,YAAY,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACxD,IAAA,uBAAY,EAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,EAAE,GAAG,IAAA,wBAAQ,EAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhF,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,IAAA,4BAAiB,EAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;gBAClC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;SACI,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;AACF,CAAC"}
|
|
@@ -15,5 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./createSqliteWorker.js"), exports);
|
|
18
|
+
__exportStar(require("./createWorkerDb.js"), exports);
|
|
18
19
|
__exportStar(require("./nodeEndpoint.js"), exports);
|
|
20
|
+
__exportStar(require("./resolveCurrentFileLocationFromStack.js"), exports);
|
|
19
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,oDAAkC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,sDAAoC;AACpC,oDAAkC;AAClC,2EAAyD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveCurrentFileLocationFromStack = resolveCurrentFileLocationFromStack;
|
|
4
|
+
const node_url_1 = require("node:url");
|
|
5
|
+
/** @internal */
|
|
6
|
+
function resolveCurrentFileLocationFromStack(stack = new Error().stack) {
|
|
7
|
+
const stackFilename = stack?.match(/\((file:\/\/[^)]+SqliteWorkerRunner\.js):\d+:\d+\)/)?.[1];
|
|
8
|
+
if (!stackFilename)
|
|
9
|
+
throw new Error('Worker location could not be resolved from Error stack, pass sqliteWorkerRunnerLocation');
|
|
10
|
+
return (0, node_url_1.fileURLToPath)(stackFilename);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=resolveCurrentFileLocationFromStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveCurrentFileLocationFromStack.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/resolveCurrentFileLocationFromStack.ts"],"names":[],"mappings":";;AAGA,kFAMC;AATD,uCAAyC;AAEzC,gBAAgB;AAChB,SAAgB,mCAAmC,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK;IAC5E,MAAM,aAAa,GAAG,KAAK,EAAE,KAAK,CAAC,oDAAoD,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,IAAI,CAAC,aAAa;QACjB,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IAE5G,OAAO,IAAA,wBAAa,EAAC,aAAa,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -17,7 +17,7 @@ class AbstractWorkerProjection extends AbstractProjection_ts_1.AbstractProjectio
|
|
|
17
17
|
return undefined;
|
|
18
18
|
const projectionMethodsToWire = [
|
|
19
19
|
'project',
|
|
20
|
-
'
|
|
20
|
+
'_projectBatch',
|
|
21
21
|
'ping',
|
|
22
22
|
'getLastProjectedEvent'
|
|
23
23
|
];
|
|
@@ -41,9 +41,10 @@ class AbstractWorkerProjection extends AbstractProjection_ts_1.AbstractProjectio
|
|
|
41
41
|
ping() {
|
|
42
42
|
return true;
|
|
43
43
|
}
|
|
44
|
-
/** @internal
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
/** @internal Project restore events in batches to avoid one Comlink roundtrip per event */
|
|
45
|
+
async _projectBatch(events) {
|
|
46
|
+
for (const event of events)
|
|
47
|
+
await this._project(event);
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
50
|
* Returns the last projected event if the view implements IEventLocker, otherwise undefined.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractWorkerProjection.js","sourceRoot":"","sources":["../../../src/workers/AbstractWorkerProjection.ts"],"names":[],"mappings":";;;AAAA,6DAAmD;AACnD,oEAA8D;AAC9D,+CAI0B;AAI1B;;;GAGG;AACH,MAAsB,wBACrB,SAAQ,0CAAyB;IAGjC;;OAEG;IACH,MAAM,CAAC,4BAA4B,CAElC,OAAiB;QAEjB,IAAI,kCAAY;YACf,OAAO,SAAS,CAAC;QAElB,MAAM,uBAAuB,GAAG;YAC/B,SAAS;YACT,
|
|
1
|
+
{"version":3,"file":"AbstractWorkerProjection.js","sourceRoot":"","sources":["../../../src/workers/AbstractWorkerProjection.ts"],"names":[],"mappings":";;;AAAA,6DAAmD;AACnD,oEAA8D;AAC9D,+CAI0B;AAI1B;;;GAGG;AACH,MAAsB,wBACrB,SAAQ,0CAAyB;IAGjC;;OAEG;IACH,MAAM,CAAC,4BAA4B,CAElC,OAAiB;QAEjB,IAAI,kCAAY;YACf,OAAO,SAAS,CAAC;QAElB,MAAM,uBAAuB,GAAG;YAC/B,SAAS;YACT,eAAe;YACf,MAAM;YACN,uBAAuB;SACO,CAAC;QAEhC,IAAI,OAAO;YACV,OAAO,IAAA,+BAA8B,EAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAEzE,OAAO,IAAA,+BAA8B,EAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAI0B,SAAsB;QACxE,OAAO,IAAA,6BAAwB,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,gBAAgB;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAED,uFAAuF;IACvF,kDAAkD;IAC3C,IAAI;QACV,OAAO,IAAI,CAAC;IACb,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,aAAa,CAAC,MAAgB;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB;QACjC,OAAO,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IAC1C,CAAC;CACD;AA9DD,4DA8DC"}
|
|
@@ -45,12 +45,14 @@ const InMemoryLock_ts_1 = require("../in-memory/InMemoryLock.js");
|
|
|
45
45
|
* and view calls to AbstractWorkerThreadProjection instance
|
|
46
46
|
*/
|
|
47
47
|
class WorkerProxyProjection {
|
|
48
|
+
static RESTORE_BATCH_SIZE = 5_000;
|
|
48
49
|
#worker;
|
|
49
50
|
#workerInit;
|
|
50
51
|
#remoteProjection;
|
|
51
52
|
#remoteView;
|
|
52
53
|
#logger;
|
|
53
54
|
#messageTypes;
|
|
55
|
+
#disposed = false;
|
|
54
56
|
viewLocker = new InMemoryLock_ts_1.InMemoryLock();
|
|
55
57
|
get remoteProjection() {
|
|
56
58
|
return this.#remoteProjection;
|
|
@@ -91,7 +93,12 @@ class WorkerProxyProjection {
|
|
|
91
93
|
if (this.viewLocker)
|
|
92
94
|
this.viewLocker.unlock();
|
|
93
95
|
}
|
|
94
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Restore view state from not-yet-projected events.
|
|
98
|
+
*
|
|
99
|
+
* Events are projected in batches to reduce worker RPC overhead.
|
|
100
|
+
* The batch size can be configured through {@link WorkerProxyProjection.RESTORE_BATCH_SIZE}.
|
|
101
|
+
*/
|
|
95
102
|
async _restore(eventStore) {
|
|
96
103
|
if (!this.#worker)
|
|
97
104
|
await this.#workerInit;
|
|
@@ -101,10 +108,17 @@ class WorkerProxyProjection {
|
|
|
101
108
|
const eventsIterable = eventStore.getEventsByTypes(this.#messageTypes, { afterEvent: lastEvent });
|
|
102
109
|
let eventsCount = 0;
|
|
103
110
|
const startTs = Date.now();
|
|
111
|
+
const batch = [];
|
|
104
112
|
for await (const event of eventsIterable) {
|
|
105
|
-
|
|
113
|
+
batch.push(event);
|
|
106
114
|
eventsCount += 1;
|
|
115
|
+
if (batch.length >= WorkerProxyProjection.RESTORE_BATCH_SIZE) {
|
|
116
|
+
await this._projectBatch(batch);
|
|
117
|
+
batch.length = 0;
|
|
118
|
+
}
|
|
107
119
|
}
|
|
120
|
+
if (batch.length)
|
|
121
|
+
await this._projectBatch(batch);
|
|
108
122
|
this.#logger?.info(`view restored from ${eventsCount} event(s) in ${Date.now() - startTs} ms`);
|
|
109
123
|
}
|
|
110
124
|
_onWorkerError = (error) => {
|
|
@@ -129,10 +143,13 @@ class WorkerProxyProjection {
|
|
|
129
143
|
await this.#workerInit;
|
|
130
144
|
return this.#remoteProjection.project(event);
|
|
131
145
|
}
|
|
132
|
-
|
|
133
|
-
|
|
146
|
+
_projectBatch(batch) {
|
|
147
|
+
return this.remoteProjection._projectBatch(batch);
|
|
134
148
|
}
|
|
135
149
|
dispose() {
|
|
150
|
+
if (this.#disposed)
|
|
151
|
+
return;
|
|
152
|
+
this.#disposed = true;
|
|
136
153
|
this.#remoteProjection[Comlink.releaseProxy]();
|
|
137
154
|
this.#remoteView[Comlink.releaseProxy]();
|
|
138
155
|
this.#worker?.terminate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerProxyProjection.js","sourceRoot":"","sources":["../../../src/workers/WorkerProxyProjection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA6D;
|
|
1
|
+
{"version":3,"file":"WorkerProxyProjection.js","sourceRoot":"","sources":["../../../src/workers/WorkerProxyProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncSqliteStatement.js","sourceRoot":"","sources":["../../../src/sqlite-workers/AsyncSqliteStatement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AsyncSqliteStatement.js","sourceRoot":"","sources":["../../../src/sqlite-workers/AsyncSqliteStatement.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,oBAAoB;IAKvB,UAAU,CAAmC;IAC7C,OAAO,CAA8B;IAE9C,YACC,SAA2C,EAC3C,MAAmC;QAEnC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAgB,MAAmD;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAoB,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,GAAG,CAAgB,MAAmD;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAA8B,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAmD;QAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;CACD"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as Comlink from 'comlink';
|
|
2
2
|
import { createSqliteWorker, nodeEndpoint } from "./utils/index.js";
|
|
3
|
-
import { SqliteWorkerRunner } from "./SqliteWorkerRunner.js";
|
|
4
3
|
import { AsyncSqliteStatement } from "./AsyncSqliteStatement.js";
|
|
5
4
|
export class SqliteWorkerProxy {
|
|
6
5
|
#config;
|
|
@@ -40,11 +39,7 @@ export class SqliteWorkerProxy {
|
|
|
40
39
|
async assertWorker() {
|
|
41
40
|
if (this.#worker)
|
|
42
41
|
return this.#worker;
|
|
43
|
-
|
|
44
|
-
this.#workerPromise ??= createSqliteWorker({
|
|
45
|
-
...dbParams,
|
|
46
|
-
sqliteWorkerRunnerLocation
|
|
47
|
-
})
|
|
42
|
+
this.#workerPromise ??= createSqliteWorker(this.#config)
|
|
48
43
|
.then(worker => {
|
|
49
44
|
this.#worker = worker;
|
|
50
45
|
worker.once('error', this.handleWorkerError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteWorkerProxy.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerProxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAOnC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SqliteWorkerProxy.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { parentPort, workerData } from 'node:worker_threads';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
3
|
import * as Comlink from 'comlink';
|
|
5
|
-
import Database from 'better-sqlite3';
|
|
6
4
|
import { isSqliteWorkerData } from "./protocol.js";
|
|
7
|
-
import { nodeEndpoint } from "./utils/index.js";
|
|
8
|
-
import { assertString, assertStringArray } from "../utils/index.js";
|
|
5
|
+
import { createWorkerDb, nodeEndpoint, resolveCurrentFileLocationFromStack } from "./utils/index.js";
|
|
9
6
|
function all(statement, params) {
|
|
10
7
|
return params === undefined ? statement.all() : statement.all(params);
|
|
11
8
|
}
|
|
@@ -15,13 +12,6 @@ function get(statement, params) {
|
|
|
15
12
|
function run(statement, params) {
|
|
16
13
|
return params === undefined ? statement.run() : statement.run(params);
|
|
17
14
|
}
|
|
18
|
-
/** @internal */
|
|
19
|
-
export function resolveCurrentFileLocationFromStack(stack = new Error().stack) {
|
|
20
|
-
const stackFilename = stack?.match(/\((file:\/\/[^)]+SqliteWorkerRunner\.js):\d+:\d+\)/)?.[1];
|
|
21
|
-
if (!stackFilename)
|
|
22
|
-
throw new Error('Worker location could not be resolved from Error stack, pass sqliteWorkerRunnerLocation');
|
|
23
|
-
return fileURLToPath(stackFilename);
|
|
24
|
-
}
|
|
25
15
|
export class SqliteWorkerRunner {
|
|
26
16
|
static get location() {
|
|
27
17
|
if (typeof __filename !== 'undefined' && path.isAbsolute(__filename))
|
|
@@ -32,17 +22,11 @@ export class SqliteWorkerRunner {
|
|
|
32
22
|
#db;
|
|
33
23
|
#nextStatementHandle = 1;
|
|
34
24
|
#statements = new Map();
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
});
|
|
41
|
-
if (dbParams.pragmas?.length) {
|
|
42
|
-
assertStringArray(dbParams.pragmas, 'dbParams.pragmas');
|
|
43
|
-
for (const pragma of dbParams.pragmas)
|
|
44
|
-
this.#db.pragma(pragma);
|
|
45
|
-
}
|
|
25
|
+
static async create(dbParams) {
|
|
26
|
+
return new SqliteWorkerRunner(await createWorkerDb(dbParams));
|
|
27
|
+
}
|
|
28
|
+
constructor(db) {
|
|
29
|
+
this.#db = db;
|
|
46
30
|
}
|
|
47
31
|
all(sql, params) {
|
|
48
32
|
const statement = this.#db.prepare(sql);
|
|
@@ -82,10 +66,13 @@ export class SqliteWorkerRunner {
|
|
|
82
66
|
}
|
|
83
67
|
/* istanbul ignore next -- this branch runs inside the spawned worker process */
|
|
84
68
|
if (parentPort) {
|
|
69
|
+
const port = parentPort;
|
|
85
70
|
if (!isSqliteWorkerData(workerData))
|
|
86
71
|
throw new Error('workerData does not contain SQLite worker db parameters');
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
void SqliteWorkerRunner.create(workerData.dbConfig)
|
|
73
|
+
.then(runner => {
|
|
74
|
+
port.postMessage({ type: 'ready' });
|
|
75
|
+
Comlink.expose(runner, nodeEndpoint(port));
|
|
76
|
+
});
|
|
90
77
|
}
|
|
91
78
|
//# sourceMappingURL=SqliteWorkerRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteWorkerRunner.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"SqliteWorkerRunner.js","sourceRoot":"","sources":["../../../src/sqlite-workers/SqliteWorkerRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
const isObject = (obj) => typeof obj === 'object'
|
|
2
|
+
&& obj !== null
|
|
3
|
+
&& !Array.isArray(obj)
|
|
4
|
+
&& !(obj instanceof Date);
|
|
1
5
|
export function isSqliteWorkerData(value) {
|
|
2
|
-
return
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
typeof value.db === 'object' &&
|
|
6
|
-
value.db !== null &&
|
|
7
|
-
'location' in value.db &&
|
|
8
|
-
typeof value.db.location === 'string';
|
|
6
|
+
return isObject(value)
|
|
7
|
+
&& 'dbConfig' in value
|
|
8
|
+
&& isObject(value.dbConfig);
|
|
9
9
|
}
|
|
10
10
|
export function isSqliteWorkerReadyMessage(value) {
|
|
11
11
|
return typeof value === 'object' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sqlite-workers/protocol.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sqlite-workers/protocol.ts"],"names":[],"mappings":"AA2DA,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAa,EAAE,CAC5C,OAAO,GAAG,KAAK,QAAQ;OACpB,GAAG,KAAK,IAAI;OACZ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;OACnB,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;AAE3B,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC;WAClB,UAAU,IAAI,KAAK;WACnB,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC/B,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;AACzB,CAAC"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { Worker } from 'node:worker_threads';
|
|
2
2
|
import { isSqliteWorkerReadyMessage } from "../protocol.js";
|
|
3
|
-
import {
|
|
4
|
-
export async function createSqliteWorker(
|
|
5
|
-
|
|
6
|
-
if (pragmas?.length)
|
|
7
|
-
assertStringArray(pragmas, 'pragmas');
|
|
8
|
-
assertString(sqliteWorkerRunnerLocation, 'sqliteWorkerRunnerLocation');
|
|
9
|
-
const workerData = { db: { location, pragmas } };
|
|
3
|
+
import { SqliteWorkerRunner } from "../SqliteWorkerRunner.js";
|
|
4
|
+
export async function createSqliteWorker(params) {
|
|
5
|
+
const { sqliteWorkerRunnerLocation = SqliteWorkerRunner.location, ...workerData } = params;
|
|
10
6
|
const worker = new Worker(sqliteWorkerRunnerLocation, { workerData });
|
|
11
7
|
await new Promise((resolve, reject) => {
|
|
12
8
|
let onError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSqliteWorker.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createSqliteWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"createSqliteWorker.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createSqliteWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAgC,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA+B;IACvE,MAAM,EACL,0BAA0B,GAAG,kBAAkB,CAAC,QAAQ,EACxD,GAAG,UAAU,EACb,GAAG,MAAM,CAAC;IAEX,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,0BAA0B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,OAA+B,CAAC;QACpC,IAAI,SAAqC,CAAC;QAC1C,IAAI,MAAkC,CAAC;QAEvC,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;YAChC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;gBACvC,OAAO;YAER,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;YAC1B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import createDb from 'better-sqlite3';
|
|
10
|
+
import { assertFunction, assertString, assertStringArray } from "../../utils/index.js";
|
|
11
|
+
function resolveImportLocation(location) {
|
|
12
|
+
if (location instanceof URL)
|
|
13
|
+
/* istanbul ignore next -- file URL imports are exercised by Node workers outside ts-jest */
|
|
14
|
+
return location.href;
|
|
15
|
+
return location;
|
|
16
|
+
}
|
|
17
|
+
export async function createWorkerDb(params) {
|
|
18
|
+
if ('dbFactoryLocation' in params && !!params.dbFactoryLocation) {
|
|
19
|
+
const factoryModule = await import(__rewriteRelativeImportExtension(resolveImportLocation(params.dbFactoryLocation)));
|
|
20
|
+
const createSqliteWorkerDb = factoryModule.createSqliteWorkerDb ??
|
|
21
|
+
factoryModule.default?.createSqliteWorkerDb ??
|
|
22
|
+
factoryModule.default;
|
|
23
|
+
assertFunction(createSqliteWorkerDb, 'createSqliteWorkerDb');
|
|
24
|
+
return createSqliteWorkerDb(params.dbFactoryParams);
|
|
25
|
+
}
|
|
26
|
+
else if ('dbLocation' in params && !!params.dbLocation) {
|
|
27
|
+
assertString(params.dbLocation, 'dbLocation');
|
|
28
|
+
const db = createDb(params.dbLocation, { readonly: true, fileMustExist: true });
|
|
29
|
+
if (params.pragmas?.length) {
|
|
30
|
+
assertStringArray(params.pragmas, 'pragmas');
|
|
31
|
+
for (const pragma of params.pragmas)
|
|
32
|
+
db.pragma(pragma);
|
|
33
|
+
}
|
|
34
|
+
return db;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new Error('Either dbLocation or dbFactoryLocation is required');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=createWorkerDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkerDb.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/createWorkerDb.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,QAA2B,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvF,SAAS,qBAAqB,CAAC,QAAsB;IACpD,IAAI,QAAQ,YAAY,GAAG;QAC1B,4FAA4F;QAC5F,OAAO,QAAQ,CAAC,IAAI,CAAC;IAEtB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkC;IACtE,IAAI,mBAAmB,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACjE,MAAM,aAAa,GAAG,MAAM,MAAM,kCAAC,qBAAqB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAC,CAAC;QACpF,MAAM,oBAAoB,GACzB,aAAa,CAAC,oBAAoB;YAClC,aAAa,CAAC,OAAO,EAAE,oBAAoB;YAC3C,aAAa,CAAC,OAAO,CAAC;QAEvB,cAAc,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QAE7D,OAAO,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC;SACI,IAAI,YAAY,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACxD,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhF,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;gBAClC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;SACI,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0CAA0C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
/** @internal */
|
|
3
|
+
export function resolveCurrentFileLocationFromStack(stack = new Error().stack) {
|
|
4
|
+
const stackFilename = stack?.match(/\((file:\/\/[^)]+SqliteWorkerRunner\.js):\d+:\d+\)/)?.[1];
|
|
5
|
+
if (!stackFilename)
|
|
6
|
+
throw new Error('Worker location could not be resolved from Error stack, pass sqliteWorkerRunnerLocation');
|
|
7
|
+
return fileURLToPath(stackFilename);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=resolveCurrentFileLocationFromStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveCurrentFileLocationFromStack.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/resolveCurrentFileLocationFromStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,gBAAgB;AAChB,MAAM,UAAU,mCAAmC,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK;IAC5E,MAAM,aAAa,GAAG,KAAK,EAAE,KAAK,CAAC,oDAAoD,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,IAAI,CAAC,aAAa;QACjB,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IAE5G,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -14,7 +14,7 @@ export class AbstractWorkerProjection extends AbstractProjection {
|
|
|
14
14
|
return undefined;
|
|
15
15
|
const projectionMethodsToWire = [
|
|
16
16
|
'project',
|
|
17
|
-
'
|
|
17
|
+
'_projectBatch',
|
|
18
18
|
'ping',
|
|
19
19
|
'getLastProjectedEvent'
|
|
20
20
|
];
|
|
@@ -38,9 +38,10 @@ export class AbstractWorkerProjection extends AbstractProjection {
|
|
|
38
38
|
ping() {
|
|
39
39
|
return true;
|
|
40
40
|
}
|
|
41
|
-
/** @internal
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
/** @internal Project restore events in batches to avoid one Comlink roundtrip per event */
|
|
42
|
+
async _projectBatch(events) {
|
|
43
|
+
for (const event of events)
|
|
44
|
+
await this._project(event);
|
|
44
45
|
}
|
|
45
46
|
/**
|
|
46
47
|
* Returns the last projected event if the view implements IEventLocker, otherwise undefined.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractWorkerProjection.js","sourceRoot":"","sources":["../../../src/workers/AbstractWorkerProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACN,kBAAkB,IAAI,wBAAwB,EAC9C,oBAAoB,IAAI,8BAA8B,EAEtD,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,MAAM,OAAgB,wBACrB,SAAQ,kBAAyB;IAGjC;;OAEG;IACH,MAAM,CAAC,4BAA4B,CAElC,OAAiB;QAEjB,IAAI,YAAY;YACf,OAAO,SAAS,CAAC;QAElB,MAAM,uBAAuB,GAAG;YAC/B,SAAS;YACT,
|
|
1
|
+
{"version":3,"file":"AbstractWorkerProjection.js","sourceRoot":"","sources":["../../../src/workers/AbstractWorkerProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACN,kBAAkB,IAAI,wBAAwB,EAC9C,oBAAoB,IAAI,8BAA8B,EAEtD,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,MAAM,OAAgB,wBACrB,SAAQ,kBAAyB;IAGjC;;OAEG;IACH,MAAM,CAAC,4BAA4B,CAElC,OAAiB;QAEjB,IAAI,YAAY;YACf,OAAO,SAAS,CAAC;QAElB,MAAM,uBAAuB,GAAG;YAC/B,SAAS;YACT,eAAe;YACf,MAAM;YACN,uBAAuB;SACO,CAAC;QAEhC,IAAI,OAAO;YACV,OAAO,8BAA8B,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAEzE,OAAO,8BAA8B,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAI0B,SAAsB;QACxE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,gBAAgB;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAED,uFAAuF;IACvF,kDAAkD;IAC3C,IAAI;QACV,OAAO,IAAI,CAAC;IACb,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,aAAa,CAAC,MAAgB;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB;QACjC,OAAO,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IAC1C,CAAC;CACD"}
|
|
@@ -9,12 +9,14 @@ import { InMemoryLock } from "../in-memory/InMemoryLock.js";
|
|
|
9
9
|
* and view calls to AbstractWorkerThreadProjection instance
|
|
10
10
|
*/
|
|
11
11
|
export class WorkerProxyProjection {
|
|
12
|
+
static RESTORE_BATCH_SIZE = 5_000;
|
|
12
13
|
#worker;
|
|
13
14
|
#workerInit;
|
|
14
15
|
#remoteProjection;
|
|
15
16
|
#remoteView;
|
|
16
17
|
#logger;
|
|
17
18
|
#messageTypes;
|
|
19
|
+
#disposed = false;
|
|
18
20
|
viewLocker = new InMemoryLock();
|
|
19
21
|
get remoteProjection() {
|
|
20
22
|
return this.#remoteProjection;
|
|
@@ -55,7 +57,12 @@ export class WorkerProxyProjection {
|
|
|
55
57
|
if (this.viewLocker)
|
|
56
58
|
this.viewLocker.unlock();
|
|
57
59
|
}
|
|
58
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Restore view state from not-yet-projected events.
|
|
62
|
+
*
|
|
63
|
+
* Events are projected in batches to reduce worker RPC overhead.
|
|
64
|
+
* The batch size can be configured through {@link WorkerProxyProjection.RESTORE_BATCH_SIZE}.
|
|
65
|
+
*/
|
|
59
66
|
async _restore(eventStore) {
|
|
60
67
|
if (!this.#worker)
|
|
61
68
|
await this.#workerInit;
|
|
@@ -65,10 +72,17 @@ export class WorkerProxyProjection {
|
|
|
65
72
|
const eventsIterable = eventStore.getEventsByTypes(this.#messageTypes, { afterEvent: lastEvent });
|
|
66
73
|
let eventsCount = 0;
|
|
67
74
|
const startTs = Date.now();
|
|
75
|
+
const batch = [];
|
|
68
76
|
for await (const event of eventsIterable) {
|
|
69
|
-
|
|
77
|
+
batch.push(event);
|
|
70
78
|
eventsCount += 1;
|
|
79
|
+
if (batch.length >= WorkerProxyProjection.RESTORE_BATCH_SIZE) {
|
|
80
|
+
await this._projectBatch(batch);
|
|
81
|
+
batch.length = 0;
|
|
82
|
+
}
|
|
71
83
|
}
|
|
84
|
+
if (batch.length)
|
|
85
|
+
await this._projectBatch(batch);
|
|
72
86
|
this.#logger?.info(`view restored from ${eventsCount} event(s) in ${Date.now() - startTs} ms`);
|
|
73
87
|
}
|
|
74
88
|
_onWorkerError = (error) => {
|
|
@@ -93,10 +107,13 @@ export class WorkerProxyProjection {
|
|
|
93
107
|
await this.#workerInit;
|
|
94
108
|
return this.#remoteProjection.project(event);
|
|
95
109
|
}
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
_projectBatch(batch) {
|
|
111
|
+
return this.remoteProjection._projectBatch(batch);
|
|
98
112
|
}
|
|
99
113
|
dispose() {
|
|
114
|
+
if (this.#disposed)
|
|
115
|
+
return;
|
|
116
|
+
this.#disposed = true;
|
|
100
117
|
this.#remoteProjection[Comlink.releaseProxy]();
|
|
101
118
|
this.#remoteView[Comlink.releaseProxy]();
|
|
102
119
|
this.#worker?.terminate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerProxyProjection.js","sourceRoot":"","sources":["../../../src/workers/WorkerProxyProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkerProxyProjection.js","sourceRoot":"","sources":["../../../src/workers/WorkerProxyProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as Comlink from 'comlink';
|
|
2
2
|
import type { SqliteRunResult, ISqliteWorkerApi, SqliteWorkerQueryParams, SqliteWorkerStatementHandle } from './protocol.ts';
|
|
3
|
-
|
|
3
|
+
type AsyncSqliteStatementParams<BindParameters extends unknown[]> = SqliteWorkerQueryParams & (BindParameters | Record<string, unknown>);
|
|
4
|
+
export declare class AsyncSqliteStatement<BindParameters extends unknown[] = unknown[], Result = unknown> {
|
|
4
5
|
#private;
|
|
5
6
|
constructor(workerApi: Comlink.Remote<ISqliteWorkerApi>, handle: SqliteWorkerStatementHandle);
|
|
6
|
-
all<TRow>(params?:
|
|
7
|
-
get<TRow>(params?:
|
|
8
|
-
run(params?:
|
|
7
|
+
all<TRow = Result>(params?: AsyncSqliteStatementParams<BindParameters>): Promise<TRow[]>;
|
|
8
|
+
get<TRow = Result>(params?: AsyncSqliteStatementParams<BindParameters>): Promise<TRow | undefined>;
|
|
9
|
+
run(params?: AsyncSqliteStatementParams<BindParameters>): Promise<SqliteRunResult>;
|
|
9
10
|
}
|
|
11
|
+
export {};
|
|
@@ -6,7 +6,7 @@ export declare class SqliteWorkerProxy {
|
|
|
6
6
|
all<TRow>(sql: string, params?: SqliteWorkerQueryParams): Promise<TRow[]>;
|
|
7
7
|
get<TRow>(sql: string, params?: SqliteWorkerQueryParams): Promise<TRow | undefined>;
|
|
8
8
|
run(sql: string, params?: SqliteWorkerQueryParams): Promise<SqliteRunResult>;
|
|
9
|
-
prepare(sql: string): Promise<AsyncSqliteStatement
|
|
9
|
+
prepare<BindParameters extends unknown[] | {} = unknown[], Result = unknown>(sql: string): Promise<BindParameters extends unknown[] ? AsyncSqliteStatement<BindParameters, Result> : AsyncSqliteStatement<[BindParameters], Result>>;
|
|
10
10
|
dispose(): Promise<void>;
|
|
11
11
|
handleWorkerError: (_err: Error) => void;
|
|
12
12
|
handleWorkerExit: (_exitCode: number) => void;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
1
2
|
import { type SqliteRunResult, type ISqliteWorkerApi, type SqliteWorkerRunnerDbParams, type SqliteWorkerQueryParams, type SqliteWorkerStatementHandle } from './protocol.ts';
|
|
2
3
|
export declare class SqliteWorkerRunner implements ISqliteWorkerApi {
|
|
3
4
|
#private;
|
|
4
5
|
static get location(): string;
|
|
5
|
-
|
|
6
|
+
static create(dbParams: SqliteWorkerRunnerDbParams): Promise<SqliteWorkerRunner>;
|
|
7
|
+
constructor(db: Database);
|
|
6
8
|
all<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow[];
|
|
7
9
|
get<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow | undefined;
|
|
8
10
|
run(sql: string, params?: SqliteWorkerQueryParams): SqliteRunResult;
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
import type { Statement } from 'better-sqlite3';
|
|
1
|
+
import type { Database, Statement } from 'better-sqlite3';
|
|
2
2
|
export type SqliteWorkerProxyParams = {
|
|
3
|
-
/** SQLite database file opened readonly by the worker. */
|
|
4
|
-
dbLocation: string;
|
|
5
|
-
/** PRAGMA statements applied to the worker connection. */
|
|
6
|
-
pragmas?: readonly string[];
|
|
7
3
|
/** Worker runner script location; defaults to the bundled runner. */
|
|
8
4
|
sqliteWorkerRunnerLocation?: string | URL;
|
|
5
|
+
dbConfig: SqliteWorkerRunnerDbParams;
|
|
9
6
|
};
|
|
10
7
|
export type SqliteWorkerRunnerDbParams = {
|
|
11
|
-
|
|
8
|
+
/** SQLite database file opened readonly by the worker. */
|
|
9
|
+
dbLocation: string;
|
|
10
|
+
/** PRAGMA statements applied to the worker connection. */
|
|
12
11
|
pragmas?: readonly string[];
|
|
12
|
+
} | {
|
|
13
|
+
/** Module exporting createSqliteWorkerDb for custom worker-side DB creation. */
|
|
14
|
+
dbFactoryLocation: string | URL;
|
|
15
|
+
/** Structured-cloneable params passed to the custom worker DB factory. */
|
|
16
|
+
dbFactoryParams: unknown;
|
|
13
17
|
};
|
|
18
|
+
export type SqliteWorkerDbFactory = (params: unknown) => Database | Promise<Database>;
|
|
14
19
|
export type SqliteWorkerData = {
|
|
15
|
-
|
|
20
|
+
dbConfig: SqliteWorkerRunnerDbParams;
|
|
16
21
|
};
|
|
17
22
|
export type SqliteWorkerQueryParams = readonly unknown[] | Record<string, unknown>;
|
|
18
23
|
export type SqliteWorkerStatementHandle = number;
|
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
import { Worker } from 'node:worker_threads';
|
|
2
2
|
import { type SqliteWorkerProxyParams } from '../protocol.ts';
|
|
3
|
-
|
|
4
|
-
sqliteWorkerRunnerLocation: string | URL;
|
|
5
|
-
};
|
|
6
|
-
export declare function createSqliteWorker({ sqliteWorkerRunnerLocation, dbLocation: location, pragmas }: CreateSqliteWorkerParams): Promise<Worker>;
|
|
7
|
-
export {};
|
|
3
|
+
export declare function createSqliteWorker(params: SqliteWorkerProxyParams): Promise<Worker>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IEvent, IEventStorageReader, IEventStore, IExtendableLogger, ILogger, IViewLocker } from '../interfaces/index.ts';
|
|
1
|
+
import type { IEvent, IEventSet, IEventStorageReader, IEventStore, IExtendableLogger, ILogger, IViewLocker } from '../interfaces/index.ts';
|
|
2
2
|
import type { IProxyProjection, IWorkerProjection, ProxyProjectionParams } from './interfaces/index.ts';
|
|
3
3
|
import * as Comlink from 'comlink';
|
|
4
4
|
/**
|
|
@@ -7,6 +7,7 @@ import * as Comlink from 'comlink';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare class WorkerProxyProjection<TView, TProjection extends IWorkerProjection<TView> = IWorkerProjection<TView>> implements IProxyProjection<TView> {
|
|
9
9
|
#private;
|
|
10
|
+
static RESTORE_BATCH_SIZE: number;
|
|
10
11
|
viewLocker?: IViewLocker;
|
|
11
12
|
get remoteProjection(): Comlink.Remote<TProjection>;
|
|
12
13
|
get view(): Comlink.Remote<TView>;
|
|
@@ -15,12 +16,17 @@ export declare class WorkerProxyProjection<TView, TProjection extends IWorkerPro
|
|
|
15
16
|
});
|
|
16
17
|
subscribe(eventStore: IEventStore): void;
|
|
17
18
|
restore(eventStore: IEventStorageReader): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Restore view state from not-yet-projected events.
|
|
21
|
+
*
|
|
22
|
+
* Events are projected in batches to reduce worker RPC overhead.
|
|
23
|
+
* The batch size can be configured through {@link WorkerProxyProjection.RESTORE_BATCH_SIZE}.
|
|
24
|
+
*/
|
|
19
25
|
protected _restore(eventStore: IEventStorageReader): Promise<void>;
|
|
20
26
|
protected _onWorkerError: (error: unknown) => void;
|
|
21
27
|
protected _onWorkerExit: (exitCode: number) => void;
|
|
22
28
|
ensureWorkerReady(): Promise<void>;
|
|
23
29
|
project(event: IEvent): Promise<void>;
|
|
24
|
-
protected
|
|
30
|
+
protected _projectBatch(batch: IEventSet): Promise<void>;
|
|
25
31
|
dispose(): void;
|
|
26
32
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-cqrs",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.2",
|
|
4
4
|
"description": "TypeScript CQRS/Event Sourcing toolkit for Node.js with DI, sagas, projections, and optional Worker, RabbitMQ, and SQLite adapters",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|