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.
Files changed (78) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/AbstractAggregate.js +3 -6
  3. package/dist/cjs/AbstractAggregate.js.map +1 -1
  4. package/dist/cjs/AbstractProjection.js +0 -2
  5. package/dist/cjs/AbstractProjection.js.map +1 -1
  6. package/dist/cjs/AbstractSaga.js +2 -2
  7. package/dist/cjs/AbstractSaga.js.map +1 -1
  8. package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
  9. package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -1
  10. package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -1
  11. package/dist/cjs/sqlite-workers/AsyncSqliteStatement.js +22 -0
  12. package/dist/cjs/sqlite-workers/AsyncSqliteStatement.js.map +1 -0
  13. package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js +126 -0
  14. package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js.map +1 -0
  15. package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js +132 -0
  16. package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js.map +1 -0
  17. package/dist/cjs/sqlite-workers/index.js +19 -0
  18. package/dist/cjs/sqlite-workers/index.js.map +1 -0
  19. package/dist/cjs/sqlite-workers/protocol.js +20 -0
  20. package/dist/cjs/sqlite-workers/protocol.js.map +1 -0
  21. package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js +43 -0
  22. package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js.map +1 -0
  23. package/dist/cjs/sqlite-workers/utils/index.js +19 -0
  24. package/dist/cjs/sqlite-workers/utils/index.js.map +1 -0
  25. package/dist/cjs/sqlite-workers/utils/nodeEndpoint.js +46 -0
  26. package/dist/cjs/sqlite-workers/utils/nodeEndpoint.js.map +1 -0
  27. package/dist/cjs/utils/getHandler.js +12 -6
  28. package/dist/cjs/utils/getHandler.js.map +1 -1
  29. package/dist/cjs/utils/subscribe.js +0 -1
  30. package/dist/cjs/utils/subscribe.js.map +1 -1
  31. package/dist/cjs/utils/validateHandlers.js +1 -1
  32. package/dist/cjs/utils/validateHandlers.js.map +1 -1
  33. package/dist/esm/AbstractAggregate.js +4 -7
  34. package/dist/esm/AbstractAggregate.js.map +1 -1
  35. package/dist/esm/AbstractProjection.js +0 -2
  36. package/dist/esm/AbstractProjection.js.map +1 -1
  37. package/dist/esm/AbstractSaga.js +3 -3
  38. package/dist/esm/AbstractSaga.js.map +1 -1
  39. package/dist/esm/CqrsContainerBuilder.js.map +1 -1
  40. package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -1
  41. package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -1
  42. package/dist/esm/sqlite-workers/AsyncSqliteStatement.js +18 -0
  43. package/dist/esm/sqlite-workers/AsyncSqliteStatement.js.map +1 -0
  44. package/dist/esm/sqlite-workers/SqliteWorkerProxy.js +89 -0
  45. package/dist/esm/sqlite-workers/SqliteWorkerProxy.js.map +1 -0
  46. package/dist/esm/sqlite-workers/SqliteWorkerRunner.js +91 -0
  47. package/dist/esm/sqlite-workers/SqliteWorkerRunner.js.map +1 -0
  48. package/dist/esm/sqlite-workers/index.js +3 -0
  49. package/dist/esm/sqlite-workers/index.js.map +1 -0
  50. package/dist/esm/sqlite-workers/protocol.js +16 -0
  51. package/dist/esm/sqlite-workers/protocol.js.map +1 -0
  52. package/dist/esm/sqlite-workers/utils/createSqliteWorker.js +40 -0
  53. package/dist/esm/sqlite-workers/utils/createSqliteWorker.js.map +1 -0
  54. package/dist/esm/sqlite-workers/utils/index.js +3 -0
  55. package/dist/esm/sqlite-workers/utils/index.js.map +1 -0
  56. package/dist/esm/sqlite-workers/utils/nodeEndpoint.js +10 -0
  57. package/dist/esm/sqlite-workers/utils/nodeEndpoint.js.map +1 -0
  58. package/dist/esm/utils/getHandler.js +12 -7
  59. package/dist/esm/utils/getHandler.js.map +1 -1
  60. package/dist/esm/utils/subscribe.js +0 -1
  61. package/dist/esm/utils/subscribe.js.map +1 -1
  62. package/dist/esm/utils/validateHandlers.js +2 -2
  63. package/dist/esm/utils/validateHandlers.js.map +1 -1
  64. package/dist/types/AbstractAggregate.d.ts +7 -2
  65. package/dist/types/CqrsContainerBuilder.d.ts +6 -6
  66. package/dist/types/in-memory/InMemoryMessageBus.d.ts +2 -5
  67. package/dist/types/interfaces/ICommandBus.d.ts +6 -4
  68. package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +2 -5
  69. package/dist/types/sqlite-workers/AsyncSqliteStatement.d.ts +9 -0
  70. package/dist/types/sqlite-workers/SqliteWorkerProxy.d.ts +13 -0
  71. package/dist/types/sqlite-workers/SqliteWorkerRunner.d.ts +10 -0
  72. package/dist/types/sqlite-workers/index.d.ts +3 -0
  73. package/dist/types/sqlite-workers/protocol.d.ts +30 -0
  74. package/dist/types/sqlite-workers/utils/createSqliteWorker.d.ts +7 -0
  75. package/dist/types/sqlite-workers/utils/index.d.ts +2 -0
  76. package/dist/types/sqlite-workers/utils/nodeEndpoint.d.ts +2 -0
  77. package/dist/types/utils/getHandler.d.ts +5 -3
  78. 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,3 @@
1
+ export * from "./createSqliteWorker.js";
2
+ export * from "./nodeEndpoint.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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 getHandler(context, messageType) {
6
- assertObject(context, 'context');
5
+ export function getOptionalHandler(instance, messageType) {
6
+ assertObject(instance, 'instance');
7
7
  assertString(messageType, 'messageType');
8
- if (messageType in context && typeof context[messageType] === 'function')
9
- return context[messageType];
8
+ if (messageType in instance && typeof instance[messageType] === 'function')
9
+ return instance[messageType];
10
10
  const privateHandlerName = `_${messageType}`;
11
- if (privateHandlerName in context && typeof context[privateHandlerName] === 'function')
12
- return context[privateHandlerName];
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":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAA+B,EAAE,WAAmB;IAC9E,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjC,YAAY,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzC,IAAI,WAAW,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,UAAU;QACvE,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7B,MAAM,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7C,IAAI,kBAAkB,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,kBAAkB,CAAC,KAAK,UAAU;QACrF,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpC,OAAO,IAAI,CAAC;AACb,CAAC"}
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;QACnE,cAAc,CAAC,OAAO,EAAE,IAAI,WAAW,WAAW,CAAC,CAAC;QAEpD,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
+ {"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 { getHandler } from "./getHandler.js";
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 (!getHandler(instance, type))
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,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;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,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,4CAA4C,CAAC,CAAC;IACxE,CAAC;AACF,CAAC"}
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
- /** Internal aggregate state */
37
- protected state: TState | undefined;
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 TypeConfig, type ClassOrFactory } from 'di0';
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,3 @@
1
+ export * from './AsyncSqliteStatement.ts';
2
+ export * from './SqliteWorkerProxy.ts';
3
+ export type { SqliteRunResult, SqliteWorkerProxyParams, SqliteWorkerQueryParams } from './protocol.ts';
@@ -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 {};
@@ -0,0 +1,2 @@
1
+ export * from './createSqliteWorker.ts';
2
+ export * from './nodeEndpoint.ts';
@@ -0,0 +1,2 @@
1
+ import * as Comlink from 'comlink';
2
+ export declare const nodeEndpoint: (arg: any) => Comlink.Endpoint;
@@ -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 getHandler(context: {
4
+ export declare function getOptionalHandler(instance: {
6
5
  [key: string]: any;
7
- }, messageType: string): IMessageHandler | null;
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.1.0-beta.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",