node-cqrs 1.1.0-beta.1 → 1.2.0-alpha.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/CHANGELOG.md +24 -0
- package/dist/cjs/AbstractAggregate.js +3 -6
- package/dist/cjs/AbstractAggregate.js.map +1 -1
- package/dist/cjs/AbstractProjection.js +0 -2
- package/dist/cjs/AbstractProjection.js.map +1 -1
- package/dist/cjs/AbstractSaga.js +2 -2
- package/dist/cjs/AbstractSaga.js.map +1 -1
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/cjs/sqlite-workers/AsyncSqliteStatement.js +22 -0
- package/dist/cjs/sqlite-workers/AsyncSqliteStatement.js.map +1 -0
- package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js +126 -0
- package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js.map +1 -0
- package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js +132 -0
- package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js.map +1 -0
- package/dist/cjs/sqlite-workers/index.js +19 -0
- package/dist/cjs/sqlite-workers/index.js.map +1 -0
- package/dist/cjs/sqlite-workers/protocol.js +20 -0
- package/dist/cjs/sqlite-workers/protocol.js.map +1 -0
- package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js +43 -0
- package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js.map +1 -0
- package/dist/cjs/sqlite-workers/utils/index.js +19 -0
- package/dist/cjs/sqlite-workers/utils/index.js.map +1 -0
- package/dist/cjs/sqlite-workers/utils/nodeEndpoint.js +46 -0
- package/dist/cjs/sqlite-workers/utils/nodeEndpoint.js.map +1 -0
- package/dist/cjs/utils/getHandler.js +12 -6
- package/dist/cjs/utils/getHandler.js.map +1 -1
- package/dist/cjs/utils/subscribe.js +0 -1
- package/dist/cjs/utils/subscribe.js.map +1 -1
- package/dist/cjs/utils/validateHandlers.js +1 -1
- package/dist/cjs/utils/validateHandlers.js.map +1 -1
- package/dist/esm/AbstractAggregate.js +4 -7
- package/dist/esm/AbstractAggregate.js.map +1 -1
- package/dist/esm/AbstractProjection.js +0 -2
- package/dist/esm/AbstractProjection.js.map +1 -1
- package/dist/esm/AbstractSaga.js +3 -3
- package/dist/esm/AbstractSaga.js.map +1 -1
- package/dist/esm/CqrsContainerBuilder.js.map +1 -1
- package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/esm/sqlite-workers/AsyncSqliteStatement.js +18 -0
- package/dist/esm/sqlite-workers/AsyncSqliteStatement.js.map +1 -0
- package/dist/esm/sqlite-workers/SqliteWorkerProxy.js +89 -0
- package/dist/esm/sqlite-workers/SqliteWorkerProxy.js.map +1 -0
- package/dist/esm/sqlite-workers/SqliteWorkerRunner.js +91 -0
- package/dist/esm/sqlite-workers/SqliteWorkerRunner.js.map +1 -0
- package/dist/esm/sqlite-workers/index.js +3 -0
- package/dist/esm/sqlite-workers/index.js.map +1 -0
- package/dist/esm/sqlite-workers/protocol.js +16 -0
- package/dist/esm/sqlite-workers/protocol.js.map +1 -0
- package/dist/esm/sqlite-workers/utils/createSqliteWorker.js +40 -0
- package/dist/esm/sqlite-workers/utils/createSqliteWorker.js.map +1 -0
- package/dist/esm/sqlite-workers/utils/index.js +3 -0
- package/dist/esm/sqlite-workers/utils/index.js.map +1 -0
- package/dist/esm/sqlite-workers/utils/nodeEndpoint.js +10 -0
- package/dist/esm/sqlite-workers/utils/nodeEndpoint.js.map +1 -0
- package/dist/esm/utils/getHandler.js +12 -7
- package/dist/esm/utils/getHandler.js.map +1 -1
- package/dist/esm/utils/subscribe.js +0 -1
- package/dist/esm/utils/subscribe.js.map +1 -1
- package/dist/esm/utils/validateHandlers.js +2 -2
- package/dist/esm/utils/validateHandlers.js.map +1 -1
- package/dist/types/AbstractAggregate.d.ts +7 -2
- package/dist/types/CqrsContainerBuilder.d.ts +6 -6
- package/dist/types/in-memory/InMemoryMessageBus.d.ts +2 -5
- package/dist/types/interfaces/ICommandBus.d.ts +6 -4
- package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +2 -5
- package/dist/types/sqlite-workers/AsyncSqliteStatement.d.ts +9 -0
- package/dist/types/sqlite-workers/SqliteWorkerProxy.d.ts +13 -0
- package/dist/types/sqlite-workers/SqliteWorkerRunner.d.ts +10 -0
- package/dist/types/sqlite-workers/index.d.ts +3 -0
- package/dist/types/sqlite-workers/protocol.d.ts +30 -0
- package/dist/types/sqlite-workers/utils/createSqliteWorker.d.ts +7 -0
- package/dist/types/sqlite-workers/utils/index.d.ts +2 -0
- package/dist/types/sqlite-workers/utils/nodeEndpoint.d.ts +2 -0
- package/dist/types/utils/getHandler.d.ts +5 -3
- package/package.json +7 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
2
|
+
import { isSqliteWorkerReadyMessage } from "../protocol.js";
|
|
3
|
+
import { assertString, assertStringArray } from "../../utils/assert.js";
|
|
4
|
+
export async function createSqliteWorker({ sqliteWorkerRunnerLocation, dbLocation: location, pragmas }) {
|
|
5
|
+
assertString(location, 'location');
|
|
6
|
+
if (pragmas?.length)
|
|
7
|
+
assertStringArray(pragmas, 'pragmas');
|
|
8
|
+
assertString(sqliteWorkerRunnerLocation, 'sqliteWorkerRunnerLocation');
|
|
9
|
+
const workerData = { db: { location, pragmas } };
|
|
10
|
+
const worker = new Worker(sqliteWorkerRunnerLocation, { workerData });
|
|
11
|
+
await new Promise((resolve, reject) => {
|
|
12
|
+
let onError;
|
|
13
|
+
let onMessage;
|
|
14
|
+
let onExit;
|
|
15
|
+
const cleanup = () => {
|
|
16
|
+
worker.off('error', onError);
|
|
17
|
+
worker.off('message', onMessage);
|
|
18
|
+
worker.off('exit', onExit);
|
|
19
|
+
};
|
|
20
|
+
onMessage = (message) => {
|
|
21
|
+
if (!isSqliteWorkerReadyMessage(message))
|
|
22
|
+
return;
|
|
23
|
+
cleanup();
|
|
24
|
+
resolve();
|
|
25
|
+
};
|
|
26
|
+
onError = (err) => {
|
|
27
|
+
cleanup();
|
|
28
|
+
reject(err);
|
|
29
|
+
};
|
|
30
|
+
onExit = (exitCode) => {
|
|
31
|
+
cleanup();
|
|
32
|
+
reject(new Error(`SQLite worker exited prematurely with exit code ${exitCode}`));
|
|
33
|
+
};
|
|
34
|
+
worker.on('message', onMessage);
|
|
35
|
+
worker.once('error', onError);
|
|
36
|
+
worker.once('exit', onExit);
|
|
37
|
+
});
|
|
38
|
+
return worker;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=createSqliteWorker.js.map
|
|
@@ -0,0 +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,EACN,0BAA0B,EAG1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAMxE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACxC,0BAA0B,EAC1B,UAAU,EAAE,QAAQ,EACpB,OAAO,EACmB;IAC1B,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,OAAO,EAAE,MAAM;QAClB,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACvC,YAAY,CAAC,0BAA0B,EAAE,4BAA4B,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAqB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;IACnE,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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
// Jest (CJS) cannot import the ESM adapter;
|
|
4
|
+
// the UMD build is CJS/UMD but the default export shape varies by loader
|
|
5
|
+
const requireFromHere = createRequire(typeof __filename === 'undefined' || !path.isAbsolute(__filename) ?
|
|
6
|
+
`${process.cwd()}/package.json` :
|
|
7
|
+
__filename);
|
|
8
|
+
const nodeEndpointModule = requireFromHere('comlink/dist/umd/node-adapter');
|
|
9
|
+
export const nodeEndpoint = (nodeEndpointModule?.default ?? nodeEndpointModule);
|
|
10
|
+
//# sourceMappingURL=nodeEndpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeEndpoint.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/nodeEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC,4CAA4C;AAC5C,yEAAyE;AACzE,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,UAAU,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACxG,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjC,UAAU,CAAC,CAAC;AACb,MAAM,kBAAkB,GAAG,eAAe,CAAC,+BAA+B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,YAAY,GACxB,CAAC,kBAAkB,EAAE,OAAO,IAAI,kBAAkB,CAAQ,CAAC"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import { assertObject, assertString } from "./assert.js";
|
|
1
|
+
import { assertFunction, assertObject, assertString } from "./assert.js";
|
|
2
2
|
/**
|
|
3
3
|
* Gets a handler for a specific message type, prefers a public (w\o _ prefix) method, if available
|
|
4
4
|
*/
|
|
5
|
-
export function
|
|
6
|
-
assertObject(
|
|
5
|
+
export function getOptionalHandler(instance, messageType) {
|
|
6
|
+
assertObject(instance, 'instance');
|
|
7
7
|
assertString(messageType, 'messageType');
|
|
8
|
-
if (messageType in
|
|
9
|
-
return
|
|
8
|
+
if (messageType in instance && typeof instance[messageType] === 'function')
|
|
9
|
+
return instance[messageType];
|
|
10
10
|
const privateHandlerName = `_${messageType}`;
|
|
11
|
-
if (privateHandlerName in
|
|
12
|
-
return
|
|
11
|
+
if (privateHandlerName in instance && typeof instance[privateHandlerName] === 'function')
|
|
12
|
+
return instance[privateHandlerName];
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
|
+
export function getHandler(instance, messageType) {
|
|
16
|
+
const handler = getOptionalHandler(instance, messageType);
|
|
17
|
+
assertFunction(handler, messageType);
|
|
18
|
+
return handler;
|
|
19
|
+
}
|
|
15
20
|
//# sourceMappingURL=getHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getHandler.js","sourceRoot":"","sources":["../../../src/utils/getHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getHandler.js","sourceRoot":"","sources":["../../../src/utils/getHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CACjC,QAAgC,EAChC,WAAmB;IAEnB,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnC,YAAY,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzC,IAAI,WAAW,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,UAAU;QACzE,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE9B,MAAM,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7C,IAAI,kBAAkB,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,kBAAkB,CAAC,KAAK,UAAU;QACvF,OAAO,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAErC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CACzB,QAAgC,EAChC,WAAmB;IAEnB,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -26,7 +26,6 @@ export function subscribe(observable, observer, options = {}) {
|
|
|
26
26
|
assertStringArray(subscribeTo, 'either options.messageTypes, observer.handles or ObserverType.handles');
|
|
27
27
|
for (const messageType of unique(subscribeTo)) {
|
|
28
28
|
const handler = masterHandler || getHandler(observer, messageType);
|
|
29
|
-
assertFunction(handler, `'${messageType}' handler`);
|
|
30
29
|
if (queueName) {
|
|
31
30
|
if (!isObservableQueueProvider(observable))
|
|
32
31
|
throw new TypeError('Observer does not support named queues');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../../src/utils/subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,MAAM,GAAG,CAAI,GAAQ,EAAO,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAS,sBAAsB,CAAC,uBAA4C;IAC3E,aAAa,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACjE,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC,OAAO;QACtE,OAAO,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAEtC,OAAO,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACxB,UAAuB,EACvB,QAAgB,EAChB,UAII,EAAE;IAEN,gBAAgB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3C,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEnC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC3D,IAAI,aAAa;QAChB,cAAc,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,YAAY,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACrE,iBAAiB,CAAC,WAAW,EAAE,uEAAuE,CAAC,CAAC;IAExG,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,IAAI,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../../src/utils/subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,MAAM,GAAG,CAAI,GAAQ,EAAO,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAS,sBAAsB,CAAC,uBAA4C;IAC3E,aAAa,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACjE,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC,OAAO;QACtE,OAAO,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAEtC,OAAO,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACxB,UAAuB,EACvB,QAAgB,EAChB,UAII,EAAE;IAEN,gBAAgB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3C,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEnC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC3D,IAAI,aAAa;QAChB,cAAc,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,YAAY,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACrE,iBAAiB,CAAC,WAAW,EAAE,uEAAuE,CAAC,CAAC;IAExG,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,IAAI,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEnE,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC;gBACzC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;YAE/D,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACnG,CAAC;aACI,CAAC;YACL,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assertObject, assertOptionalArray, assertString } from "./assert.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getOptionalHandler } from "./getHandler.js";
|
|
3
3
|
/**
|
|
4
4
|
* Ensure instance has handlers declared for all handled message types
|
|
5
5
|
*/
|
|
@@ -11,7 +11,7 @@ export function validateHandlers(instance, handlesFieldName = 'handles') {
|
|
|
11
11
|
assertOptionalArray(messageTypes, handlesFieldName);
|
|
12
12
|
for (const type of messageTypes) {
|
|
13
13
|
assertString(type, 'type');
|
|
14
|
-
if (!
|
|
14
|
+
if (!getOptionalHandler(instance, type))
|
|
15
15
|
throw new Error(`'${type}' handler is not defined or not a function`);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateHandlers.js","sourceRoot":"","sources":["../../../src/utils/validateHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"validateHandlers.js","sourceRoot":"","sources":["../../../src/utils/validateHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,gBAAgB,GAAG,SAAS;IAC9E,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEnC,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACnF,IAAI,YAAY,KAAK,SAAS;QAC7B,OAAO;IAER,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QACjC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,4CAA4C,CAAC,CAAC;IACxE,CAAC;AACF,CAAC"}
|
|
@@ -33,8 +33,13 @@ export declare abstract class AbstractAggregate<TState extends IMutableState | o
|
|
|
33
33
|
static register<T extends AbstractAggregate<S>, S extends IMutableState | object | void>(this: IAggregateConstructor<T, S> & (new (options: IAggregateConstructorParams<S>) => T), eventStore: IEventStore, commandBus: ICommandBus): AggregateCommandHandler<T>;
|
|
34
34
|
/** List of emitted events */
|
|
35
35
|
protected changes: IEvent[];
|
|
36
|
-
/**
|
|
37
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Internal aggregate state.
|
|
38
|
+
*
|
|
39
|
+
* Stateful aggregates must initialize it either by passing `state` to the base
|
|
40
|
+
* constructor, declaring a class field, or assigning it in the derived constructor.
|
|
41
|
+
*/
|
|
42
|
+
protected state: TState;
|
|
38
43
|
/** Command being handled by aggregate */
|
|
39
44
|
protected command?: ICommand;
|
|
40
45
|
/** Unique aggregate instance identifier */
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { ContainerBuilder, type
|
|
1
|
+
import { ContainerBuilder, type ClassOrFactory } from 'di0';
|
|
2
2
|
import { type IAggregateConstructor, type ICommandHandler, type IContainer, type IEventReceptor, type IProjection, type ISagaConstructor } from './interfaces/index.ts';
|
|
3
3
|
export declare class CqrsContainerBuilder<TContainerInterface extends IContainer = IContainer> extends ContainerBuilder<TContainerInterface> {
|
|
4
4
|
constructor(options?: ConstructorParameters<typeof ContainerBuilder>[0]);
|
|
5
5
|
/** Register command handler, which will be subscribed to commandBus upon instance creation */
|
|
6
|
-
registerCommandHandler(typeOrFactory: ClassOrFactory<ICommandHandler, TContainerInterface>): TypeConfig<ICommandHandler, TContainerInterface>;
|
|
6
|
+
registerCommandHandler(typeOrFactory: ClassOrFactory<ICommandHandler, TContainerInterface>): import("di0").TypeConfig<ICommandHandler, TContainerInterface>;
|
|
7
7
|
/** Register event receptor, which will be subscribed to eventStore upon instance creation */
|
|
8
|
-
registerEventReceptor(typeOrFactory: ClassOrFactory<IEventReceptor, TContainerInterface>): TypeConfig<IEventReceptor, TContainerInterface>;
|
|
8
|
+
registerEventReceptor(typeOrFactory: ClassOrFactory<IEventReceptor, TContainerInterface>): import("di0").TypeConfig<IEventReceptor, TContainerInterface>;
|
|
9
9
|
/**
|
|
10
10
|
* Register projection, which will expose view and will be subscribed
|
|
11
11
|
* to eventStore and will restore its state upon instance creation
|
|
12
12
|
*/
|
|
13
|
-
registerProjection(typeOrFactory: ClassOrFactory<IProjection<any>, TContainerInterface>, exposedViewAlias?: keyof TContainerInterface): TypeConfig<IProjection<any>, TContainerInterface>;
|
|
13
|
+
registerProjection(typeOrFactory: ClassOrFactory<IProjection<any>, TContainerInterface>, exposedViewAlias?: keyof TContainerInterface): import("di0").TypeConfig<IProjection<any>, TContainerInterface>;
|
|
14
14
|
/** Register aggregate type in the container */
|
|
15
|
-
registerAggregate(AggregateType: IAggregateConstructor<any, any>): TypeConfig<ICommandHandler, TContainerInterface>;
|
|
15
|
+
registerAggregate(AggregateType: IAggregateConstructor<any, any>): import("di0").TypeConfig<ICommandHandler, TContainerInterface>;
|
|
16
16
|
/** Register saga type in the container */
|
|
17
|
-
registerSaga(SagaType: ISagaConstructor): TypeConfig<IEventReceptor, TContainerInterface>;
|
|
17
|
+
registerSaga(SagaType: ISagaConstructor): import("di0").TypeConfig<IEventReceptor, TContainerInterface>;
|
|
18
18
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ICommand, ICommandBus, IEvent, IEventBus, IMessageHandler, IMessageMeta, IObservable, IObservableQueueProvider } from '../interfaces/index.ts';
|
|
1
|
+
import type { CommandOptions, ICommand, ICommandBus, IEvent, IEventBus, IMessageHandler, IMessageMeta, IObservable, IObservableQueueProvider } from '../interfaces/index.ts';
|
|
2
2
|
/**
|
|
3
3
|
* Default implementation of the message bus.
|
|
4
4
|
* Keeps all subscriptions and messages in memory.
|
|
@@ -28,10 +28,7 @@ export declare class InMemoryMessageBus implements IEventBus, ICommandBus, IObse
|
|
|
28
28
|
/**
|
|
29
29
|
* Send command to exactly 1 command handler
|
|
30
30
|
*/
|
|
31
|
-
send(commandType: string, aggregateId?: string, options?:
|
|
32
|
-
payload?: object;
|
|
33
|
-
context?: object;
|
|
34
|
-
} & IMessageMeta): Promise<any>;
|
|
31
|
+
send(commandType: string, aggregateId?: string, options?: CommandOptions): Promise<any>;
|
|
35
32
|
/**
|
|
36
33
|
* Send pre-built command to exactly 1 command handler
|
|
37
34
|
*/
|
|
@@ -2,12 +2,14 @@ import type { ICommand } from './ICommand.ts';
|
|
|
2
2
|
import type { IMessageMeta } from './IMessageMeta.ts';
|
|
3
3
|
import type { IObservable } from './IObservable.ts';
|
|
4
4
|
import type { IObserver } from './IObserver.ts';
|
|
5
|
+
export type CommandOptions = IMessageMeta & {
|
|
6
|
+
payload?: object;
|
|
7
|
+
context?: object;
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
};
|
|
5
10
|
export interface ICommandBus extends IObservable {
|
|
6
11
|
send(command: ICommand, meta?: IMessageMeta): Promise<any>;
|
|
7
|
-
send(commandType: string, aggregateId?: string, options?:
|
|
8
|
-
payload?: object;
|
|
9
|
-
context?: object;
|
|
10
|
-
} & IMessageMeta): Promise<any>;
|
|
12
|
+
send(commandType: string, aggregateId?: string, options?: CommandOptions): Promise<any>;
|
|
11
13
|
/** @deprecated Use {@link send} */
|
|
12
14
|
sendRaw(command: ICommand): Promise<any>;
|
|
13
15
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IContainer } from 'node-cqrs';
|
|
2
|
-
import type { ICommand, ICommandBus, IMessageHandler, IMessageMeta } from '../interfaces/index.ts';
|
|
2
|
+
import type { CommandOptions, ICommand, ICommandBus, IMessageHandler, IMessageMeta } from '../interfaces/index.ts';
|
|
3
3
|
import { type Subscription } from './RabbitMqGateway.ts';
|
|
4
4
|
export type RabbitMqCommandBusConfig = Partial<Pick<Subscription, 'exchange' | 'queueName' | 'ignoreOwn' | 'concurrentLimit' | 'handlerProcessTimeout' | 'queueExpires' | 'deadLetterQueue' | 'messageTtl'>>;
|
|
5
5
|
/**
|
|
@@ -16,10 +16,7 @@ export declare class RabbitMqCommandBus implements ICommandBus {
|
|
|
16
16
|
/**
|
|
17
17
|
* Format and send a command for execution
|
|
18
18
|
*/
|
|
19
|
-
send(commandType: string, aggregateId?: string, options?:
|
|
20
|
-
payload?: object;
|
|
21
|
-
context?: object;
|
|
22
|
-
} & IMessageMeta): Promise<any>;
|
|
19
|
+
send(commandType: string, aggregateId?: string, options?: CommandOptions): Promise<any>;
|
|
23
20
|
/**
|
|
24
21
|
* Sends a pre-built command to the exchange, routed to the durable queue.
|
|
25
22
|
* Exactly one consumer will process it.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as Comlink from 'comlink';
|
|
2
|
+
import type { SqliteRunResult, ISqliteWorkerApi, SqliteWorkerQueryParams, SqliteWorkerStatementHandle } from './protocol.ts';
|
|
3
|
+
export declare class AsyncSqliteStatement {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(workerApi: Comlink.Remote<ISqliteWorkerApi>, handle: SqliteWorkerStatementHandle);
|
|
6
|
+
all<TRow>(params?: SqliteWorkerQueryParams): Promise<TRow[]>;
|
|
7
|
+
get<TRow>(params?: SqliteWorkerQueryParams): Promise<TRow | undefined>;
|
|
8
|
+
run(params?: SqliteWorkerQueryParams): Promise<SqliteRunResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SqliteWorkerProxyParams, SqliteWorkerQueryParams, SqliteRunResult } from './protocol.ts';
|
|
2
|
+
import { AsyncSqliteStatement } from './AsyncSqliteStatement.ts';
|
|
3
|
+
export declare class SqliteWorkerProxy {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(config: SqliteWorkerProxyParams);
|
|
6
|
+
all<TRow>(sql: string, params?: SqliteWorkerQueryParams): Promise<TRow[]>;
|
|
7
|
+
get<TRow>(sql: string, params?: SqliteWorkerQueryParams): Promise<TRow | undefined>;
|
|
8
|
+
run(sql: string, params?: SqliteWorkerQueryParams): Promise<SqliteRunResult>;
|
|
9
|
+
prepare(sql: string): Promise<AsyncSqliteStatement>;
|
|
10
|
+
dispose(): Promise<void>;
|
|
11
|
+
handleWorkerError: (_err: Error) => void;
|
|
12
|
+
handleWorkerExit: (_exitCode: number) => void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SqliteRunResult, type ISqliteWorkerApi, type SqliteWorkerRunnerDbParams, type SqliteWorkerQueryParams, type SqliteWorkerStatementHandle } from './protocol.ts';
|
|
2
|
+
export declare class SqliteWorkerRunner implements ISqliteWorkerApi {
|
|
3
|
+
#private;
|
|
4
|
+
static get location(): string;
|
|
5
|
+
constructor(dbParams: SqliteWorkerRunnerDbParams);
|
|
6
|
+
all<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow[];
|
|
7
|
+
get<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow | undefined;
|
|
8
|
+
run(sql: string, params?: SqliteWorkerQueryParams): SqliteRunResult;
|
|
9
|
+
prepare(sql: string): SqliteWorkerStatementHandle;
|
|
10
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Statement } from 'better-sqlite3';
|
|
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
|
+
/** Worker runner script location; defaults to the bundled runner. */
|
|
8
|
+
sqliteWorkerRunnerLocation?: string | URL;
|
|
9
|
+
};
|
|
10
|
+
export type SqliteWorkerRunnerDbParams = {
|
|
11
|
+
location: string;
|
|
12
|
+
pragmas?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
export type SqliteWorkerData = {
|
|
15
|
+
db: SqliteWorkerRunnerDbParams;
|
|
16
|
+
};
|
|
17
|
+
export type SqliteWorkerQueryParams = readonly unknown[] | Record<string, unknown>;
|
|
18
|
+
export type SqliteWorkerStatementHandle = number;
|
|
19
|
+
export type SqliteRunResult = ReturnType<Statement['run']>;
|
|
20
|
+
export interface ISqliteWorkerApi {
|
|
21
|
+
all<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow[];
|
|
22
|
+
get<TRow>(sql: string, params?: SqliteWorkerQueryParams): TRow | undefined;
|
|
23
|
+
run(sql: string, params?: SqliteWorkerQueryParams): SqliteRunResult;
|
|
24
|
+
prepare(sql: string): SqliteWorkerStatementHandle;
|
|
25
|
+
}
|
|
26
|
+
export type SqliteWorkerReadyMessage = {
|
|
27
|
+
type: 'ready';
|
|
28
|
+
};
|
|
29
|
+
export declare function isSqliteWorkerData(value: unknown): value is SqliteWorkerData;
|
|
30
|
+
export declare function isSqliteWorkerReadyMessage(value: unknown): value is SqliteWorkerReadyMessage;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
2
|
+
import { type SqliteWorkerProxyParams } from '../protocol.ts';
|
|
3
|
+
type CreateSqliteWorkerParams = SqliteWorkerProxyParams & {
|
|
4
|
+
sqliteWorkerRunnerLocation: string | URL;
|
|
5
|
+
};
|
|
6
|
+
export declare function createSqliteWorker({ sqliteWorkerRunnerLocation, dbLocation: location, pragmas }: CreateSqliteWorkerParams): Promise<Worker>;
|
|
7
|
+
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { IMessageHandler } from '../interfaces/index.ts';
|
|
2
1
|
/**
|
|
3
2
|
* Gets a handler for a specific message type, prefers a public (w\o _ prefix) method, if available
|
|
4
3
|
*/
|
|
5
|
-
export declare function
|
|
4
|
+
export declare function getOptionalHandler(instance: {
|
|
6
5
|
[key: string]: any;
|
|
7
|
-
}, messageType: string):
|
|
6
|
+
}, messageType: string): ((...args: any) => unknown) | null;
|
|
7
|
+
export declare function getHandler(instance: {
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}, messageType: string): (...args: any) => unknown;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-cqrs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-alpha.0",
|
|
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": [
|
|
@@ -48,6 +48,11 @@
|
|
|
48
48
|
"require": "./dist/cjs/sqlite/index.js",
|
|
49
49
|
"import": "./dist/esm/sqlite/index.js"
|
|
50
50
|
},
|
|
51
|
+
"./sqlite-workers": {
|
|
52
|
+
"types": "./dist/types/sqlite-workers/index.d.ts",
|
|
53
|
+
"require": "./dist/cjs/sqlite-workers/index.js",
|
|
54
|
+
"import": "./dist/esm/sqlite-workers/index.js"
|
|
55
|
+
},
|
|
51
56
|
"./redis": {
|
|
52
57
|
"types": "./dist/types/redis/index.d.ts",
|
|
53
58
|
"require": "./dist/cjs/redis/index.js",
|
|
@@ -99,6 +104,7 @@
|
|
|
99
104
|
"build:browser:bundle": "rollup -c ./rollup.browser.config.mjs",
|
|
100
105
|
"build:browser": "npm run build:esm && npm run build:browser:bundle && npm run build:browser:bundle-min",
|
|
101
106
|
"build": "npm run build:esm && npm run build:cjs",
|
|
107
|
+
"rebuild": "npm run cleanup && npm run build",
|
|
102
108
|
"prepare": "npm run build",
|
|
103
109
|
"preversion": "npm test",
|
|
104
110
|
"version": "./scripts/cleanup_obsolete_tags.sh v$npm_package_version && npm run changelog && git add CHANGELOG.md",
|