node-cqrs 1.2.0-alpha.1 → 1.2.0-alpha.3

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 (71) hide show
  1. package/CHANGELOG.md +38 -10
  2. package/README.md +20 -3
  3. package/dist/cjs/shared/worker-utils/createWorker.js +85 -0
  4. package/dist/cjs/shared/worker-utils/createWorker.js.map +1 -0
  5. package/dist/cjs/shared/worker-utils/index.js +19 -0
  6. package/dist/cjs/shared/worker-utils/index.js.map +1 -0
  7. package/dist/cjs/shared/worker-utils/nodeEndpoint.js.map +1 -0
  8. package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js +8 -2
  9. package/dist/cjs/sqlite-workers/SqliteWorkerProxy.js.map +1 -1
  10. package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js +2 -1
  11. package/dist/cjs/sqlite-workers/SqliteWorkerRunner.js.map +1 -1
  12. package/dist/cjs/sqlite-workers/protocol.js +0 -7
  13. package/dist/cjs/sqlite-workers/protocol.js.map +1 -1
  14. package/dist/cjs/sqlite-workers/utils/index.js +0 -2
  15. package/dist/cjs/sqlite-workers/utils/index.js.map +1 -1
  16. package/dist/cjs/workers/AbstractWorkerProjection.js +5 -4
  17. package/dist/cjs/workers/AbstractWorkerProjection.js.map +1 -1
  18. package/dist/cjs/workers/WorkerProxyProjection.js +25 -8
  19. package/dist/cjs/workers/WorkerProxyProjection.js.map +1 -1
  20. package/dist/cjs/workers/utils/createWorker.js +8 -77
  21. package/dist/cjs/workers/utils/createWorker.js.map +1 -1
  22. package/dist/cjs/workers/utils/createWorkerInstance.js +1 -1
  23. package/dist/cjs/workers/utils/createWorkerInstance.js.map +1 -1
  24. package/dist/cjs/workers/utils/index.js +0 -2
  25. package/dist/cjs/workers/utils/index.js.map +1 -1
  26. package/dist/esm/shared/worker-utils/createWorker.js +49 -0
  27. package/dist/esm/shared/worker-utils/createWorker.js.map +1 -0
  28. package/dist/esm/shared/worker-utils/index.js +3 -0
  29. package/dist/esm/shared/worker-utils/index.js.map +1 -0
  30. package/dist/esm/shared/worker-utils/nodeEndpoint.js.map +1 -0
  31. package/dist/esm/sqlite-workers/SqliteWorkerProxy.js +8 -2
  32. package/dist/esm/sqlite-workers/SqliteWorkerProxy.js.map +1 -1
  33. package/dist/esm/sqlite-workers/SqliteWorkerRunner.js +2 -1
  34. package/dist/esm/sqlite-workers/SqliteWorkerRunner.js.map +1 -1
  35. package/dist/esm/sqlite-workers/protocol.js +0 -6
  36. package/dist/esm/sqlite-workers/protocol.js.map +1 -1
  37. package/dist/esm/sqlite-workers/utils/index.js +0 -2
  38. package/dist/esm/sqlite-workers/utils/index.js.map +1 -1
  39. package/dist/esm/workers/AbstractWorkerProjection.js +5 -4
  40. package/dist/esm/workers/AbstractWorkerProjection.js.map +1 -1
  41. package/dist/esm/workers/WorkerProxyProjection.js +25 -8
  42. package/dist/esm/workers/WorkerProxyProjection.js.map +1 -1
  43. package/dist/esm/workers/utils/createWorker.js +8 -44
  44. package/dist/esm/workers/utils/createWorker.js.map +1 -1
  45. package/dist/esm/workers/utils/createWorkerInstance.js +1 -1
  46. package/dist/esm/workers/utils/createWorkerInstance.js.map +1 -1
  47. package/dist/esm/workers/utils/index.js +0 -2
  48. package/dist/esm/workers/utils/index.js.map +1 -1
  49. package/dist/types/shared/worker-utils/createWorker.d.ts +14 -0
  50. package/dist/types/shared/worker-utils/index.d.ts +2 -0
  51. package/dist/types/{sqlite-workers/utils → shared/worker-utils}/nodeEndpoint.d.ts +1 -1
  52. package/dist/types/sqlite-workers/protocol.d.ts +0 -1
  53. package/dist/types/sqlite-workers/utils/index.d.ts +0 -2
  54. package/dist/types/workers/WorkerProxyProjection.d.ts +9 -3
  55. package/dist/types/workers/utils/createWorker.d.ts +6 -6
  56. package/dist/types/workers/utils/index.d.ts +0 -2
  57. package/package.json +1 -1
  58. package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js +0 -39
  59. package/dist/cjs/sqlite-workers/utils/createSqliteWorker.js.map +0 -1
  60. package/dist/cjs/sqlite-workers/utils/nodeEndpoint.js.map +0 -1
  61. package/dist/cjs/workers/utils/nodeEndpoint.js +0 -8
  62. package/dist/cjs/workers/utils/nodeEndpoint.js.map +0 -1
  63. package/dist/esm/sqlite-workers/utils/createSqliteWorker.js +0 -36
  64. package/dist/esm/sqlite-workers/utils/createSqliteWorker.js.map +0 -1
  65. package/dist/esm/sqlite-workers/utils/nodeEndpoint.js.map +0 -1
  66. package/dist/esm/workers/utils/nodeEndpoint.js +0 -5
  67. package/dist/esm/workers/utils/nodeEndpoint.js.map +0 -1
  68. package/dist/types/sqlite-workers/utils/createSqliteWorker.d.ts +0 -3
  69. package/dist/types/workers/utils/nodeEndpoint.d.ts +0 -2
  70. /package/dist/cjs/{sqlite-workers/utils → shared/worker-utils}/nodeEndpoint.js +0 -0
  71. /package/dist/esm/{sqlite-workers/utils → shared/worker-utils}/nodeEndpoint.js +0 -0
@@ -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
- /** Restore view state from not-yet-projected events */
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 _project(event: IEvent): Promise<void>;
30
+ protected _projectBatch(batch: IEventSet): Promise<void>;
25
31
  dispose(): void;
26
32
  }
@@ -1,10 +1,10 @@
1
- import { Worker } from 'node:worker_threads';
2
- import { type IWorkerData } from '../protocol.ts';
1
+ import type { Worker } from 'node:worker_threads';
2
+ import type { IWorkerData } from '../protocol.ts';
3
3
  /**
4
- * Create a worker instance, await a handshake or a failure
4
+ * Create a worker instance for a projection worker module, await a handshake or a failure.
5
5
  *
6
- * @param workerModulePath - Path to worker module
7
- * @param ports - Container with MessagePorts for communication with worker projection and view instances
8
- * @returns Worker instance
6
+ * @param workerModulePath - Absolute or relative path to the worker module
7
+ * @param ports - MessagePorts for projection and view communication (transferred into the worker)
8
+ * @returns Resolved Worker instance after the ready handshake
9
9
  */
10
10
  export declare function createWorker(workerModulePath: string, ports: IWorkerData): Promise<Worker>;
@@ -1,5 +1,3 @@
1
- export * from './createWorker.ts';
2
1
  export * from './createWorkerInstance.ts';
3
- export * from './nodeEndpoint.ts';
4
2
  export * from './workerProxyFactory.ts';
5
3
  export type * from './ProjectionView.ts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-cqrs",
3
- "version": "1.2.0-alpha.1",
3
+ "version": "1.2.0-alpha.3",
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": [
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSqliteWorker = createSqliteWorker;
4
- const node_worker_threads_1 = require("node:worker_threads");
5
- const protocol_ts_1 = require("../protocol.js");
6
- const SqliteWorkerRunner_ts_1 = require("../SqliteWorkerRunner.js");
7
- async function createSqliteWorker(params) {
8
- const { sqliteWorkerRunnerLocation = SqliteWorkerRunner_ts_1.SqliteWorkerRunner.location, ...workerData } = params;
9
- const worker = new node_worker_threads_1.Worker(sqliteWorkerRunnerLocation, { workerData });
10
- await new Promise((resolve, reject) => {
11
- let onError;
12
- let onMessage;
13
- let onExit;
14
- const cleanup = () => {
15
- worker.off('error', onError);
16
- worker.off('message', onMessage);
17
- worker.off('exit', onExit);
18
- };
19
- onMessage = (message) => {
20
- if (!(0, protocol_ts_1.isSqliteWorkerReadyMessage)(message))
21
- return;
22
- cleanup();
23
- resolve();
24
- };
25
- onError = (err) => {
26
- cleanup();
27
- reject(err);
28
- };
29
- onExit = (exitCode) => {
30
- cleanup();
31
- reject(new Error(`SQLite worker exited prematurely with exit code ${exitCode}`));
32
- };
33
- worker.on('message', onMessage);
34
- worker.once('error', onError);
35
- worker.once('exit', onExit);
36
- });
37
- return worker;
38
- }
39
- //# sourceMappingURL=createSqliteWorker.js.map
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodeEndpoint.js","sourceRoot":"","sources":["../../../../src/sqlite-workers/utils/nodeEndpoint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA4C;AAC5C,gDAAkC;AAKlC,4CAA4C;AAC5C,yEAAyE;AACzE,MAAM,eAAe,GAAG,IAAA,2BAAa,EAAC,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;AAC/D,QAAA,YAAY,GACxB,CAAC,kBAAkB,EAAE,OAAO,IAAI,kBAAkB,CAAQ,CAAC"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.nodeEndpoint = void 0;
4
- // Jest (CJS) cannot import the ESM adapter;
5
- // the UMD build is CJS/UMD but the default export shape varies by loader
6
- const nodeEndpointModule = require('comlink/dist/umd/node-adapter');
7
- exports.nodeEndpoint = (nodeEndpointModule?.default ?? nodeEndpointModule);
8
- //# sourceMappingURL=nodeEndpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodeEndpoint.js","sourceRoot":"","sources":["../../../../src/workers/utils/nodeEndpoint.ts"],"names":[],"mappings":";;;AAEA,4CAA4C;AAC5C,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AACvD,QAAA,YAAY,GACxB,CAAC,kBAAkB,EAAE,OAAO,IAAI,kBAAkB,CAAQ,CAAC"}
@@ -1,36 +0,0 @@
1
- import { Worker } from 'node:worker_threads';
2
- import { isSqliteWorkerReadyMessage } from "../protocol.js";
3
- import { SqliteWorkerRunner } from "../SqliteWorkerRunner.js";
4
- export async function createSqliteWorker(params) {
5
- const { sqliteWorkerRunnerLocation = SqliteWorkerRunner.location, ...workerData } = params;
6
- const worker = new Worker(sqliteWorkerRunnerLocation, { workerData });
7
- await new Promise((resolve, reject) => {
8
- let onError;
9
- let onMessage;
10
- let onExit;
11
- const cleanup = () => {
12
- worker.off('error', onError);
13
- worker.off('message', onMessage);
14
- worker.off('exit', onExit);
15
- };
16
- onMessage = (message) => {
17
- if (!isSqliteWorkerReadyMessage(message))
18
- return;
19
- cleanup();
20
- resolve();
21
- };
22
- onError = (err) => {
23
- cleanup();
24
- reject(err);
25
- };
26
- onExit = (exitCode) => {
27
- cleanup();
28
- reject(new Error(`SQLite worker exited prematurely with exit code ${exitCode}`));
29
- };
30
- worker.on('message', onMessage);
31
- worker.once('error', onError);
32
- worker.once('exit', onExit);
33
- });
34
- return worker;
35
- }
36
- //# sourceMappingURL=createSqliteWorker.js.map
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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,5 +0,0 @@
1
- // Jest (CJS) cannot import the ESM adapter;
2
- // the UMD build is CJS/UMD but the default export shape varies by loader
3
- const nodeEndpointModule = require('comlink/dist/umd/node-adapter');
4
- export const nodeEndpoint = (nodeEndpointModule?.default ?? nodeEndpointModule);
5
- //# sourceMappingURL=nodeEndpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodeEndpoint.js","sourceRoot":"","sources":["../../../../src/workers/utils/nodeEndpoint.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,YAAY,GACxB,CAAC,kBAAkB,EAAE,OAAO,IAAI,kBAAkB,CAAQ,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Worker } from 'node:worker_threads';
2
- import { type SqliteWorkerProxyParams } from '../protocol.ts';
3
- export declare function createSqliteWorker(params: SqliteWorkerProxyParams): Promise<Worker>;
@@ -1,2 +0,0 @@
1
- import * as Comlink from 'comlink';
2
- export declare const nodeEndpoint: (arg: any) => Comlink.Endpoint;