@powerhousedao/reactor 4.1.0-dev.8 → 4.1.0-dev.81

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 (198) hide show
  1. package/dist/src/client/reactor-client.d.ts +103 -0
  2. package/dist/src/client/reactor-client.d.ts.map +1 -0
  3. package/dist/src/client/reactor-client.js +184 -0
  4. package/dist/src/client/reactor-client.js.map +1 -0
  5. package/dist/src/client/types.d.ts +213 -0
  6. package/dist/src/client/types.d.ts.map +1 -0
  7. package/dist/src/client/types.js +14 -0
  8. package/dist/src/client/types.js.map +1 -0
  9. package/dist/src/core/builder.d.ts +20 -0
  10. package/dist/src/core/builder.d.ts.map +1 -0
  11. package/dist/src/core/builder.js +47 -0
  12. package/dist/src/core/builder.js.map +1 -0
  13. package/dist/src/core/reactor.d.ts +92 -0
  14. package/dist/src/core/reactor.d.ts.map +1 -0
  15. package/dist/src/core/reactor.js +647 -0
  16. package/dist/src/core/reactor.js.map +1 -0
  17. package/dist/src/core/types.d.ts +121 -0
  18. package/dist/src/core/types.d.ts.map +1 -0
  19. package/dist/src/core/types.js +2 -0
  20. package/dist/src/core/types.js.map +1 -0
  21. package/dist/src/core/utils.d.ts +11 -0
  22. package/dist/src/core/utils.d.ts.map +1 -0
  23. package/dist/src/core/utils.js +31 -0
  24. package/dist/src/core/utils.js.map +1 -0
  25. package/dist/src/events/event-bus.d.ts +3 -3
  26. package/dist/src/events/event-bus.d.ts.map +1 -1
  27. package/dist/src/events/event-bus.js.map +1 -1
  28. package/dist/src/events/interfaces.d.ts +1 -1
  29. package/dist/src/events/interfaces.d.ts.map +1 -1
  30. package/dist/src/events/types.d.ts +15 -1
  31. package/dist/src/events/types.d.ts.map +1 -1
  32. package/dist/src/events/types.js +6 -0
  33. package/dist/src/events/types.js.map +1 -1
  34. package/dist/src/executor/interfaces.d.ts +31 -54
  35. package/dist/src/executor/interfaces.d.ts.map +1 -1
  36. package/dist/src/executor/simple-job-executor-manager.d.ts +30 -0
  37. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
  38. package/dist/src/executor/simple-job-executor-manager.js +178 -0
  39. package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
  40. package/dist/src/executor/simple-job-executor.d.ts +60 -0
  41. package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
  42. package/dist/src/executor/simple-job-executor.js +537 -0
  43. package/dist/src/executor/simple-job-executor.js.map +1 -0
  44. package/dist/src/executor/types.d.ts +24 -8
  45. package/dist/src/executor/types.d.ts.map +1 -1
  46. package/dist/src/executor/types.js.map +1 -1
  47. package/dist/src/index.d.ts +26 -3
  48. package/dist/src/index.d.ts.map +1 -1
  49. package/dist/src/index.js +33 -2
  50. package/dist/src/index.js.map +1 -1
  51. package/dist/src/job-tracker/in-memory-job-tracker.d.ts +15 -0
  52. package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -0
  53. package/dist/src/job-tracker/in-memory-job-tracker.js +78 -0
  54. package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -0
  55. package/dist/src/job-tracker/index.d.ts +3 -0
  56. package/dist/src/job-tracker/index.d.ts.map +1 -0
  57. package/dist/src/job-tracker/index.js +2 -0
  58. package/dist/src/job-tracker/index.js.map +1 -0
  59. package/dist/src/job-tracker/interfaces.d.ts +41 -0
  60. package/dist/src/job-tracker/interfaces.d.ts.map +1 -0
  61. package/dist/src/job-tracker/interfaces.js +2 -0
  62. package/dist/src/job-tracker/interfaces.js.map +1 -0
  63. package/dist/src/queue/interfaces.d.ts +45 -5
  64. package/dist/src/queue/interfaces.d.ts.map +1 -1
  65. package/dist/src/queue/job-execution-handle.d.ts +24 -0
  66. package/dist/src/queue/job-execution-handle.d.ts.map +1 -0
  67. package/dist/src/queue/job-execution-handle.js +62 -0
  68. package/dist/src/queue/job-execution-handle.js.map +1 -0
  69. package/dist/src/queue/queue.d.ts +54 -5
  70. package/dist/src/queue/queue.d.ts.map +1 -1
  71. package/dist/src/queue/queue.js +265 -36
  72. package/dist/src/queue/queue.js.map +1 -1
  73. package/dist/src/queue/types.d.ts +30 -5
  74. package/dist/src/queue/types.d.ts.map +1 -1
  75. package/dist/src/queue/types.js +12 -0
  76. package/dist/src/queue/types.js.map +1 -1
  77. package/dist/src/read-models/coordinator.d.ts +38 -0
  78. package/dist/src/read-models/coordinator.d.ts.map +1 -0
  79. package/dist/src/read-models/coordinator.js +62 -0
  80. package/dist/src/read-models/coordinator.js.map +1 -0
  81. package/dist/src/read-models/document-view.d.ts +20 -0
  82. package/dist/src/read-models/document-view.d.ts.map +1 -0
  83. package/dist/src/read-models/document-view.js +363 -0
  84. package/dist/src/read-models/document-view.js.map +1 -0
  85. package/dist/src/read-models/interfaces.d.ts +29 -0
  86. package/dist/src/read-models/interfaces.d.ts.map +1 -0
  87. package/dist/src/read-models/interfaces.js +2 -0
  88. package/dist/src/read-models/interfaces.js.map +1 -0
  89. package/dist/src/read-models/types.d.ts +46 -0
  90. package/dist/src/read-models/types.d.ts.map +1 -0
  91. package/dist/src/read-models/types.js +2 -0
  92. package/dist/src/read-models/types.js.map +1 -0
  93. package/dist/src/registry/implementation.d.ts +62 -0
  94. package/dist/src/registry/implementation.d.ts.map +1 -0
  95. package/dist/src/registry/implementation.js +96 -0
  96. package/dist/src/registry/implementation.js.map +1 -0
  97. package/dist/src/registry/index.d.ts +3 -0
  98. package/dist/src/registry/index.d.ts.map +1 -0
  99. package/dist/src/registry/index.js +2 -0
  100. package/dist/src/registry/index.js.map +1 -0
  101. package/dist/src/registry/interfaces.d.ts +39 -0
  102. package/dist/src/registry/interfaces.d.ts.map +1 -0
  103. package/dist/src/registry/interfaces.js +2 -0
  104. package/dist/src/registry/interfaces.js.map +1 -0
  105. package/dist/src/shared/awaiter.d.ts +32 -0
  106. package/dist/src/shared/awaiter.d.ts.map +1 -0
  107. package/dist/src/shared/awaiter.js +132 -0
  108. package/dist/src/shared/awaiter.js.map +1 -0
  109. package/dist/src/shared/errors.d.ts +9 -0
  110. package/dist/src/shared/errors.d.ts.map +1 -0
  111. package/dist/src/shared/errors.js +18 -0
  112. package/dist/src/shared/errors.js.map +1 -0
  113. package/dist/src/shared/factories.d.ts +16 -0
  114. package/dist/src/shared/factories.d.ts.map +1 -0
  115. package/dist/src/shared/factories.js +33 -0
  116. package/dist/src/shared/factories.js.map +1 -0
  117. package/dist/src/shared/types.d.ts +91 -19
  118. package/dist/src/shared/types.d.ts.map +1 -1
  119. package/dist/src/shared/types.js +35 -1
  120. package/dist/src/shared/types.js.map +1 -1
  121. package/dist/src/shared/utils.d.ts +3 -0
  122. package/dist/src/shared/utils.d.ts.map +1 -0
  123. package/dist/src/shared/utils.js +8 -0
  124. package/dist/src/shared/utils.js.map +1 -0
  125. package/dist/src/signer/passthrough-signer.d.ts +6 -0
  126. package/dist/src/signer/passthrough-signer.d.ts.map +1 -0
  127. package/dist/src/signer/passthrough-signer.js +6 -0
  128. package/dist/src/signer/passthrough-signer.js.map +1 -0
  129. package/dist/src/signer/types.d.ts +15 -0
  130. package/dist/src/signer/types.d.ts.map +1 -0
  131. package/dist/src/signer/types.js +2 -0
  132. package/dist/src/signer/types.js.map +1 -0
  133. package/dist/src/storage/interfaces.d.ts +108 -0
  134. package/dist/src/storage/interfaces.d.ts.map +1 -0
  135. package/dist/src/storage/interfaces.js +19 -0
  136. package/dist/src/storage/interfaces.js.map +1 -0
  137. package/dist/src/storage/kysely/store.d.ts +15 -0
  138. package/dist/src/storage/kysely/store.d.ts.map +1 -0
  139. package/dist/src/storage/kysely/store.js +197 -0
  140. package/dist/src/storage/kysely/store.js.map +1 -0
  141. package/dist/src/storage/kysely/types.d.ts +26 -0
  142. package/dist/src/storage/kysely/types.d.ts.map +1 -0
  143. package/dist/src/storage/kysely/types.js +2 -0
  144. package/dist/src/storage/kysely/types.js.map +1 -0
  145. package/dist/src/storage/txn.d.ts +15 -0
  146. package/dist/src/storage/txn.d.ts.map +1 -0
  147. package/dist/src/storage/txn.js +42 -0
  148. package/dist/src/storage/txn.js.map +1 -0
  149. package/dist/src/subs/default-error-handler.d.ts +13 -0
  150. package/dist/src/subs/default-error-handler.d.ts.map +1 -0
  151. package/dist/src/subs/default-error-handler.js +27 -0
  152. package/dist/src/subs/default-error-handler.js.map +1 -0
  153. package/dist/src/subs/react-subscription-manager.d.ts +45 -0
  154. package/dist/src/subs/react-subscription-manager.d.ts.map +1 -0
  155. package/dist/src/subs/react-subscription-manager.js +185 -0
  156. package/dist/src/subs/react-subscription-manager.js.map +1 -0
  157. package/dist/src/subs/types.d.ts +64 -0
  158. package/dist/src/subs/types.d.ts.map +1 -0
  159. package/dist/src/subs/types.js +2 -0
  160. package/dist/src/subs/types.js.map +1 -0
  161. package/dist/src/utils/reshuffle.d.ts +30 -0
  162. package/dist/src/utils/reshuffle.d.ts.map +1 -0
  163. package/dist/src/utils/reshuffle.js +47 -0
  164. package/dist/src/utils/reshuffle.js.map +1 -0
  165. package/package.json +15 -6
  166. package/dist/bench/end-to-end-flow.bench.d.ts +0 -2
  167. package/dist/bench/end-to-end-flow.bench.d.ts.map +0 -1
  168. package/dist/bench/end-to-end-flow.bench.js +0 -256
  169. package/dist/bench/end-to-end-flow.bench.js.map +0 -1
  170. package/dist/bench/event-bus.bench.d.ts +0 -2
  171. package/dist/bench/event-bus.bench.d.ts.map +0 -1
  172. package/dist/bench/event-bus.bench.js +0 -238
  173. package/dist/bench/event-bus.bench.js.map +0 -1
  174. package/dist/bench/queue-only.bench.d.ts +0 -2
  175. package/dist/bench/queue-only.bench.d.ts.map +0 -1
  176. package/dist/bench/queue-only.bench.js +0 -40
  177. package/dist/bench/queue-only.bench.js.map +0 -1
  178. package/dist/bench/reactor-throughput.bench.d.ts +0 -2
  179. package/dist/bench/reactor-throughput.bench.d.ts.map +0 -1
  180. package/dist/bench/reactor-throughput.bench.js +0 -137
  181. package/dist/bench/reactor-throughput.bench.js.map +0 -1
  182. package/dist/src/executor/job-executor.d.ts +0 -62
  183. package/dist/src/executor/job-executor.d.ts.map +0 -1
  184. package/dist/src/executor/job-executor.js +0 -325
  185. package/dist/src/executor/job-executor.js.map +0 -1
  186. package/dist/test/event-bus.test.d.ts +0 -2
  187. package/dist/test/event-bus.test.d.ts.map +0 -1
  188. package/dist/test/event-bus.test.js +0 -532
  189. package/dist/test/event-bus.test.js.map +0 -1
  190. package/dist/test/job-executor.test.d.ts +0 -2
  191. package/dist/test/job-executor.test.d.ts.map +0 -1
  192. package/dist/test/job-executor.test.js +0 -581
  193. package/dist/test/job-executor.test.js.map +0 -1
  194. package/dist/test/queue.test.d.ts +0 -2
  195. package/dist/test/queue.test.d.ts.map +0 -1
  196. package/dist/test/queue.test.js +0 -396
  197. package/dist/test/queue.test.js.map +0 -1
  198. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,121 @@
1
+ import type { Action, DocumentModelModule, Operation, PHDocument } from "document-model";
2
+ import type { JobInfo, PagedResults, PagingOptions, PropagationMode, SearchFilter, ShutdownStatus, ViewFilter } from "../shared/types.js";
3
+ /**
4
+ * The main Reactor interface that serves as a facade for document operations.
5
+ * This interface provides a unified API for document management, including
6
+ * creation, retrieval, mutation, and deletion operations.
7
+ *
8
+ * Phase 2 of the refactoring plan: IReactor Facade (Strangler Fig Pattern)
9
+ */
10
+ export interface IReactor {
11
+ /**
12
+ * Signals that the reactor should shutdown.
13
+ */
14
+ kill(): ShutdownStatus;
15
+ /**
16
+ * Retrieves a list of document model modules.
17
+ *
18
+ * @param namespace - Optional namespace like "powerhouse" or "sky", defaults to ""
19
+ * @param paging - Optional options for paging data in large queries.
20
+ * @param signal - Optional abort signal to cancel the request
21
+ * @returns List of document model modules
22
+ */
23
+ getDocumentModels(namespace?: string, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<DocumentModelModule>>;
24
+ /**
25
+ * Retrieves a specific PHDocument by id
26
+ *
27
+ * @param id - Required, this is the document id
28
+ * @param view - Optional filter containing branch and scopes information
29
+ * @param signal - Optional abort signal to cancel the request
30
+ * @returns The up-to-date PHDocument with scopes and list of child document ids
31
+ */
32
+ get<TDocument extends PHDocument>(id: string, view?: ViewFilter, signal?: AbortSignal): Promise<{
33
+ document: TDocument;
34
+ childIds: string[];
35
+ }>;
36
+ /**
37
+ * Retrieves a specific PHDocument by slug
38
+ *
39
+ * @param slug - Required, this is the document slug
40
+ * @param view - Optional filter containing branch and scopes information
41
+ * @param signal - Optional abort signal to cancel the request
42
+ * @returns The up-to-date PHDocument with scopes and list of child document ids
43
+ */
44
+ getBySlug<TDocument extends PHDocument>(slug: string, view?: ViewFilter, signal?: AbortSignal): Promise<{
45
+ document: TDocument;
46
+ childIds: string[];
47
+ }>;
48
+ /**
49
+ * Retrieves the operations for a document
50
+ *
51
+ * @param documentId - The document id
52
+ * @param view - Optional filter containing branch and scopes information
53
+ * @param paging - Optional pagination options
54
+ * @param signal - Optional abort signal to cancel the request
55
+ * @returns The list of operations
56
+ */
57
+ getOperations(documentId: string, view?: ViewFilter, paging?: PagingOptions, signal?: AbortSignal): Promise<Record<string, PagedResults<Operation>>>;
58
+ /**
59
+ * Filters documents by criteria and returns a list of them
60
+ *
61
+ * @param search - Search filter options (type, parentId, identifiers)
62
+ * @param view - Optional filter containing branch and scopes information
63
+ * @param paging - Optional pagination options
64
+ * @param signal - Optional abort signal to cancel the request
65
+ * @returns List of documents matching criteria and pagination cursor
66
+ */
67
+ find(search: SearchFilter, view?: ViewFilter, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<PHDocument>>;
68
+ /**
69
+ * Creates a document
70
+ *
71
+ * @param document - Document with optional id, slug, parent, model type, and initial state
72
+ * @param signal - Optional abort signal to cancel the request
73
+ * @returns The job status
74
+ */
75
+ create(document: PHDocument, signal?: AbortSignal): Promise<JobInfo>;
76
+ /**
77
+ * Deletes a document
78
+ *
79
+ * @param id - Document id
80
+ * @param propagate - Optional mode for handling children, CASCADE deletes child documents
81
+ * @param signal - Optional abort signal to cancel the request
82
+ * @returns The job id and status
83
+ */
84
+ deleteDocument(id: string, propagate?: PropagationMode, signal?: AbortSignal): Promise<JobInfo>;
85
+ /**
86
+ * Applies a list of actions to a document.
87
+ *
88
+ * @param id - Document id
89
+ * @param actions - List of actions to apply
90
+ * @returns The job id and status
91
+ */
92
+ mutate(id: string, actions: Action[]): Promise<JobInfo>;
93
+ /**
94
+ * Adds multiple documents as children to another
95
+ *
96
+ * @param parentId - Parent document id
97
+ * @param documentIds - List of document ids to add as children
98
+ * @param view - Optional filter containing branch and scopes information
99
+ * @param signal - Optional abort signal to cancel the request
100
+ * @returns The job id and status
101
+ */
102
+ addChildren(parentId: string, documentIds: string[], view?: ViewFilter, signal?: AbortSignal): Promise<JobInfo>;
103
+ /**
104
+ * Removes multiple documents as children from another
105
+ *
106
+ * @param parentId - Parent document id
107
+ * @param documentIds - List of document ids to remove as children
108
+ * @param view - Optional filter containing branch and scopes information
109
+ * @param signal - Optional abort signal to cancel the request
110
+ * @returns The job id and status
111
+ */
112
+ removeChildren(parentId: string, documentIds: string[], view?: ViewFilter, signal?: AbortSignal): Promise<JobInfo>;
113
+ /**
114
+ * Retrieves the status of a job
115
+ *
116
+ * @param jobId - The job id
117
+ * @returns The job status
118
+ */
119
+ getJobStatus(jobId: string, signal?: AbortSignal): Promise<JobInfo>;
120
+ }
121
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,mBAAmB,EACnB,SAAS,EACT,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,UAAU,EACX,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,IAAI,cAAc,CAAC;IAEvB;;;;;;;OAOG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE9C;;;;;;;OAOG;IACH,GAAG,CAAC,SAAS,SAAS,UAAU,EAC9B,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IAEH;;;;;;;OAOG;IACH,SAAS,CAAC,SAAS,SAAS,UAAU,EACpC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IAEH;;;;;;;;OAQG;IACH,aAAa,CACX,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEpD;;;;;;;;OAQG;IACH,IAAI,CACF,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IAErC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE;;;;;;;OAOG;IACH,cAAc,CACZ,EAAE,EAAE,MAAM,EACV,SAAS,CAAC,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD;;;;;;;;OAQG;IACH,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;;;;;OAQG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { PHDocument } from "document-model";
2
+ import type { PagedResults } from "../shared/types.js";
3
+ /**
4
+ * Filters paged results by parent ID
5
+ */
6
+ export declare function filterByParentId(results: PagedResults<PHDocument>, parentId: string): PagedResults<PHDocument>;
7
+ /**
8
+ * Filters paged results by document type
9
+ */
10
+ export declare function filterByType(results: PagedResults<PHDocument>, type: string): PagedResults<PHDocument>;
11
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,EAEjC,QAAQ,EAAE,MAAM,GACf,YAAY,CAAC,UAAU,CAAC,CAG1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,EACjC,IAAI,EAAE,MAAM,GACX,YAAY,CAAC,UAAU,CAAC,CAoB1B"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Filters paged results by parent ID
3
+ */
4
+ export function filterByParentId(results,
5
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
6
+ parentId) {
7
+ // TODO: Implement filterByParentId
8
+ return results;
9
+ }
10
+ /**
11
+ * Filters paged results by document type
12
+ */
13
+ export function filterByType(results, type) {
14
+ // Filter documents by their document type from the header
15
+ const filteredDocuments = results.results.filter((document) => document.header.documentType === type);
16
+ // Create new paged results with filtered documents
17
+ // Note: This maintains the same paging structure but with filtered results
18
+ return {
19
+ results: filteredDocuments,
20
+ options: results.options,
21
+ nextCursor: results.nextCursor,
22
+ next: results.next
23
+ ? async () => {
24
+ // If there's a next function, apply the same filter to the next page
25
+ const nextResults = await results.next();
26
+ return filterByType(nextResults, type);
27
+ }
28
+ : undefined,
29
+ };
30
+ }
31
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAiC;AACjC,6DAA6D;AAC7D,QAAgB;IAEhB,mCAAmC;IACnC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAiC,EACjC,IAAY;IAEZ,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAC9C,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,KAAK,IAAI,CACpD,CAAC;IAEF,mDAAmD;IACnD,2EAA2E;IAC3E,OAAO;QACL,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAChB,CAAC,CAAC,KAAK,IAAI,EAAE;gBACT,qEAAqE;gBACrE,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAK,EAAE,CAAC;gBAC1C,OAAO,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACzC,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
- import { IEventBus } from "./interfaces.js";
2
- import { Unsubscribe } from "./types.js";
1
+ import type { IEventBus } from "./interfaces.js";
2
+ import type { Subscriber, Unsubscribe } from "./types.js";
3
3
  export declare class EventBus implements IEventBus {
4
- private eventTypeToSubscribers;
4
+ readonly eventTypeToSubscribers: Map<number, Subscriber[]>;
5
5
  subscribe<K>(type: number, subscriber: (type: number, event: K) => void | Promise<void>): Unsubscribe;
6
6
  emit(type: number, data: any): Promise<void>;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAsC,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7E,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,sBAAsB,CAAwC;IAEtE,SAAS,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,WAAW;IA8BR,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBnD"}
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,QAAS,YAAW,SAAS;IACxC,SAAgB,sBAAsB,4BAAmC;IAEzE,SAAS,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,WAAW;IA8BR,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/events/event-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAA2B,MAAM,YAAY,CAAC;AAE7E,MAAM,OAAO,QAAQ;IACX,sBAAsB,GAA8B,IAAI,GAAG,EAAE,CAAC;IAEtE,SAAS,CACP,IAAY,EACZ,UAA4D;QAE5D,IAAI,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAwB,CAAC,CAAC;QAEpC,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,IAAI,GAAG,IAAI,CAAC;YAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAwB,CAAC,CAAC;YAClD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAS;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,kFAAkF;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9B,2DAA2D;QAC3D,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/events/event-bus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,OAAO,QAAQ;IACH,sBAAsB,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEzE,SAAS,CACP,IAAY,EACZ,UAA4D;QAE5D,IAAI,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAwB,CAAC,CAAC;QAEpC,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,IAAI,GAAG,IAAI,CAAC;YAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAwB,CAAC,CAAC;YAClD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAS;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,kFAAkF;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9B,2DAA2D;QAC3D,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import { Unsubscribe } from "./types.js";
1
+ import type { Unsubscribe } from "./types.js";
2
2
  /**
3
3
  * Describes an object that manages event subscriptions and emissions.
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/events/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;OAQG;IACH,SAAS,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,WAAW,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/events/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;OAQG;IACH,SAAS,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,WAAW,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
@@ -1,3 +1,4 @@
1
+ import type { OperationWithContext } from "#storage/interfaces.js";
1
2
  /**
2
3
  * Describes a function to unsubscribe from an event.
3
4
  */
@@ -19,6 +20,19 @@ export type Subscriber = (type: number, data: any) => void | Promise<void>;
19
20
  */
20
21
  export declare class EventBusAggregateError extends Error {
21
22
  readonly errors: any[];
22
- constructor(errors: any[]);
23
+ constructor(errors: unknown[]);
23
24
  }
25
+ /**
26
+ * Event types for operation-related events.
27
+ */
28
+ export declare const OperationEventTypes: {
29
+ readonly OPERATION_WRITTEN: 10001;
30
+ };
31
+ /**
32
+ * Event emitted when operations are written to IOperationStore.
33
+ * Contains the operations directly to avoid round-trip queries.
34
+ */
35
+ export type OperationWrittenEvent = {
36
+ operations: OperationWithContext[];
37
+ };
24
38
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,MAAM,EAAE,GAAG,EAAE,CAAC;gBAElB,MAAM,EAAE,GAAG,EAAE;CAc1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,MAAM,EAAE,GAAG,EAAE,CAAC;gBAElB,MAAM,EAAE,OAAO,EAAE;CAc9B;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;;CAEtB,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,oBAAoB,EAAE,CAAC;CACpC,CAAC"}
@@ -17,4 +17,10 @@ export class EventBusAggregateError extends Error {
17
17
  this.errors = errors;
18
18
  }
19
19
  }
20
+ /**
21
+ * Event types for operation-related events.
22
+ */
23
+ export const OperationEventTypes = {
24
+ OPERATION_WRITTEN: 10001,
25
+ };
20
26
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/B,MAAM,CAAQ;IAE9B,YAAY,MAAa;QACvB,MAAM,OAAO,GAAG,6BAA6B,MAAM,CAAC,MAAM,cAAc,MAAM;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,CAAC,OAAO,CAAC;YACnB,CAAC;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/B,MAAM,CAAQ;IAE9B,YAAY,MAAiB;QAC3B,MAAM,OAAO,GAAG,6BAA6B,MAAM,CAAC,MAAM,cAAc,MAAM;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAQ,CAAW,CAAC,OAAO,CAAC;YAC9B,CAAC;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,iBAAiB,EAAE,KAAK;CAChB,CAAC"}
@@ -1,72 +1,49 @@
1
- import { Job } from "../queue/types.js";
2
- import { JobExecutorConfig, JobResult } from "./types.js";
1
+ import type { Job } from "../queue/types.js";
2
+ import type { ExecutorManagerStatus, JobResult } from "./types.js";
3
3
  /**
4
- * Interface for executing jobs from the queue.
5
- * Listens for 'jobAvailable' events from the event bus and pulls jobs from IQueue when capacity allows.
4
+ * Simple interface for executing a job.
5
+ * A JobExecutor simply takes a job and executes it - nothing more.
6
6
  */
7
7
  export interface IJobExecutor {
8
8
  /**
9
- * Start the job executor.
10
- * Begins listening for 'jobAvailable' events from the event bus and executing jobs when capacity allows.
11
- *
12
- * @param config - Configuration options for the executor
13
- * @returns Promise that resolves when the executor is started
14
- */
15
- start(config?: JobExecutorConfig): Promise<void>;
16
- /**
17
- * Stop the job executor.
18
- * Gracefully stops listening for events and waits for current jobs to complete.
19
- * @param graceful - Whether to wait for current jobs to complete
20
- * @returns Promise that resolves when the executor is stopped
21
- */
22
- stop(graceful?: boolean): Promise<void>;
23
- /**
24
- * Execute a single job immediately.
9
+ * Execute a single job.
25
10
  * @param job - The job to execute
26
11
  * @returns Promise that resolves to the job result
27
12
  */
28
13
  executeJob(job: Job): Promise<JobResult>;
14
+ }
15
+ /**
16
+ * Interface for managing multiple job executors.
17
+ * Listens for 'jobAvailable' events from the event bus, pulls jobs from the queue,
18
+ * and coordinates the distribution of jobs across multiple executor instances.
19
+ */
20
+ export interface IJobExecutorManager {
29
21
  /**
30
- * Get the current status of the job executor.
31
- * @returns Promise that resolves to the executor status
32
- */
33
- getStatus(): Promise<{
34
- isRunning: boolean;
35
- activeJobs: number;
36
- totalJobsProcessed: number;
37
- totalJobsSucceeded: number;
38
- totalJobsFailed: number;
39
- lastJobCompletedAt?: string;
40
- uptime?: number;
41
- }>;
42
- /**
43
- * Get statistics about job execution performance.
44
- * @returns Promise that resolves to execution statistics
22
+ * Start the executor manager.
23
+ * Begins listening for 'jobAvailable' events and dispatching to executors.
24
+ *
25
+ * @param numExecutors - Number of executor instances to create
26
+ * @returns Promise that resolves when the manager is started
45
27
  */
46
- getStats(): Promise<{
47
- averageExecutionTime: number;
48
- successRate: number;
49
- jobsPerSecond: number;
50
- queueBacklog: number;
51
- }>;
28
+ start(numExecutors: number): Promise<void>;
52
29
  /**
53
- * Pause job execution.
54
- * Stops processing new jobs but keeps the executor running.
55
- * @returns Promise that resolves when execution is paused
30
+ * Stop the executor manager.
31
+ *
32
+ * @param graceful - Whether to wait for current jobs to complete
33
+ * @returns Promise that resolves when the manager is stopped
56
34
  */
57
- pause(): Promise<void>;
35
+ stop(graceful?: boolean): Promise<void>;
58
36
  /**
59
- * Resume job execution.
60
- * Resumes processing jobs from the queue.
61
- * @returns Promise that resolves when execution is resumed
37
+ * Get all managed executor instances.
38
+ *
39
+ * @returns Array of executor instances
62
40
  */
63
- resume(): Promise<void>;
41
+ getExecutors(): IJobExecutor[];
64
42
  /**
65
- * Subscribe to job execution events.
66
- * @param event - The event type to subscribe to
67
- * @param handler - The event handler function
68
- * @returns Function to unsubscribe from the event
43
+ * Get the current status of the manager.
44
+ *
45
+ * @returns The current manager status
69
46
  */
70
- on(event: "jobStarted" | "jobCompleted" | "jobFailed" | "executorStarted" | "executorStopped", handler: (data: any) => void): () => void;
47
+ getStatus(): ExecutorManagerStatus;
71
48
  }
72
49
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/executor/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAEH;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC;QAClB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IAEH;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;;OAKG;IACH,EAAE,CACA,KAAK,EACD,YAAY,GACZ,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,iBAAiB,EACrB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAC3B,MAAM,IAAI,CAAC;CACf"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/executor/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,YAAY,IAAI,YAAY,EAAE,CAAC;IAE/B;;;;OAIG;IACH,SAAS,IAAI,qBAAqB,CAAC;CACpC"}
@@ -0,0 +1,30 @@
1
+ import type { IEventBus } from "../events/interfaces.js";
2
+ import type { IJobTracker } from "../job-tracker/interfaces.js";
3
+ import type { IQueue } from "../queue/interfaces.js";
4
+ import type { IJobExecutor, IJobExecutorManager } from "./interfaces.js";
5
+ import type { ExecutorManagerStatus } from "./types.js";
6
+ export type JobExecutorFactory = () => IJobExecutor;
7
+ /**
8
+ * Manages multiple job executors and coordinates job distribution.
9
+ * Listens for job available events and dispatches jobs to executors.
10
+ */
11
+ export declare class SimpleJobExecutorManager implements IJobExecutorManager {
12
+ private executorFactory;
13
+ private eventBus;
14
+ private queue;
15
+ private jobTracker;
16
+ private executors;
17
+ private isRunning;
18
+ private activeJobs;
19
+ private totalJobsProcessed;
20
+ private unsubscribe?;
21
+ constructor(executorFactory: JobExecutorFactory, eventBus: IEventBus, queue: IQueue, jobTracker: IJobTracker);
22
+ start(numExecutors: number): Promise<void>;
23
+ stop(graceful?: boolean): Promise<void>;
24
+ getExecutors(): IJobExecutor[];
25
+ getStatus(): ExecutorManagerStatus;
26
+ private processNextJob;
27
+ private checkForMoreJobs;
28
+ private processExistingJobs;
29
+ }
30
+ //# sourceMappingURL=simple-job-executor-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-job-executor-manager.d.ts","sourceRoot":"","sources":["../../../src/executor/simple-job-executor-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAa,MAAM,YAAY,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,MAAM,YAAY,CAAC;AAEpD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAQhE,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;IAVpB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAa;gBAGvB,eAAe,EAAE,kBAAkB,EACnC,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW;IAG3B,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC1C,IAAI,CAAC,QAAQ,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1C,YAAY,IAAI,YAAY,EAAE;IAI9B,SAAS,IAAI,qBAAqB;YASpB,cAAc;YAyEd,gBAAgB;YAkBhB,mBAAmB;CAuBlC"}
@@ -0,0 +1,178 @@
1
+ import { QueueEventTypes } from "../queue/types.js";
2
+ /**
3
+ * Manages multiple job executors and coordinates job distribution.
4
+ * Listens for job available events and dispatches jobs to executors.
5
+ */
6
+ export class SimpleJobExecutorManager {
7
+ executorFactory;
8
+ eventBus;
9
+ queue;
10
+ jobTracker;
11
+ executors = [];
12
+ isRunning = false;
13
+ activeJobs = 0;
14
+ totalJobsProcessed = 0;
15
+ unsubscribe;
16
+ constructor(executorFactory, eventBus, queue, jobTracker) {
17
+ this.executorFactory = executorFactory;
18
+ this.eventBus = eventBus;
19
+ this.queue = queue;
20
+ this.jobTracker = jobTracker;
21
+ }
22
+ async start(numExecutors) {
23
+ if (this.isRunning) {
24
+ throw new Error("JobExecutorManager is already running");
25
+ }
26
+ if (numExecutors < 1) {
27
+ throw new Error("Number of executors must be at least 1");
28
+ }
29
+ // Create executors
30
+ this.executors = [];
31
+ for (let i = 0; i < numExecutors; i++) {
32
+ this.executors.push(this.executorFactory());
33
+ }
34
+ // Start listening for job available events
35
+ this.unsubscribe = this.eventBus.subscribe(QueueEventTypes.JOB_AVAILABLE, async () => {
36
+ // Only process if we have capacity (simple round-robin for now)
37
+ if (this.activeJobs < this.executors.length) {
38
+ await this.processNextJob();
39
+ }
40
+ });
41
+ this.isRunning = true;
42
+ // Process any existing jobs in the queue
43
+ await this.processExistingJobs();
44
+ }
45
+ async stop(graceful = true) {
46
+ if (!this.isRunning) {
47
+ return;
48
+ }
49
+ // Stop listening for new jobs
50
+ if (this.unsubscribe) {
51
+ this.unsubscribe();
52
+ this.unsubscribe = undefined;
53
+ }
54
+ if (graceful) {
55
+ // Wait for active jobs to complete
56
+ while (this.activeJobs > 0) {
57
+ await new Promise((resolve) => setTimeout(resolve, 100));
58
+ }
59
+ }
60
+ this.executors = [];
61
+ this.isRunning = false;
62
+ }
63
+ getExecutors() {
64
+ return [...this.executors];
65
+ }
66
+ getStatus() {
67
+ return {
68
+ isRunning: this.isRunning,
69
+ numExecutors: this.executors.length,
70
+ activeJobs: this.activeJobs,
71
+ totalJobsProcessed: this.totalJobsProcessed,
72
+ };
73
+ }
74
+ async processNextJob() {
75
+ // dequeue next available job
76
+ let handle;
77
+ try {
78
+ handle = await this.queue.dequeueNext();
79
+ }
80
+ catch (error) {
81
+ console.error("Error dequeueing job:", error);
82
+ return;
83
+ }
84
+ if (!handle) {
85
+ return;
86
+ }
87
+ // start the job execution
88
+ handle.start();
89
+ this.activeJobs++;
90
+ this.jobTracker.markRunning(handle.job.id);
91
+ // Find an available executor (simple round-robin)
92
+ const executorIndex = this.totalJobsProcessed % this.executors.length;
93
+ const executor = this.executors[executorIndex];
94
+ // execute the job
95
+ let result;
96
+ try {
97
+ result = await executor.executeJob(handle.job);
98
+ }
99
+ catch (error) {
100
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
101
+ console.error(`Error executing job ${handle.job.id}:`, errorMessage);
102
+ handle.fail(errorMessage);
103
+ this.activeJobs--;
104
+ this.jobTracker.markFailed(handle.job.id, errorMessage);
105
+ await this.checkForMoreJobs();
106
+ return;
107
+ }
108
+ // handle the result
109
+ if (result.success) {
110
+ handle.complete();
111
+ this.totalJobsProcessed++;
112
+ this.jobTracker.markCompleted(handle.job.id, result.operations);
113
+ }
114
+ else {
115
+ // Handle retry logic
116
+ const retryCount = handle.job.retryCount || 0;
117
+ const maxRetries = handle.job.maxRetries || 0;
118
+ if (retryCount < maxRetries) {
119
+ try {
120
+ await this.queue.retryJob(handle.job.id, result.error?.message);
121
+ }
122
+ catch (error) {
123
+ const errorMessage = error instanceof Error ? error.message : "Failed to retry job";
124
+ console.error(`Failed to retry job ${handle.job.id}:`, errorMessage);
125
+ this.jobTracker.markFailed(handle.job.id, errorMessage);
126
+ handle.fail(errorMessage);
127
+ }
128
+ }
129
+ else {
130
+ const errorMessage = result.error?.message || "Unknown error";
131
+ this.jobTracker.markFailed(handle.job.id, errorMessage);
132
+ handle.fail(errorMessage);
133
+ }
134
+ }
135
+ this.activeJobs--;
136
+ await this.checkForMoreJobs();
137
+ }
138
+ async checkForMoreJobs() {
139
+ if (!this.isRunning) {
140
+ return;
141
+ }
142
+ let hasMore;
143
+ try {
144
+ hasMore = await this.queue.hasJobs();
145
+ }
146
+ catch (error) {
147
+ console.error("Error checking for more jobs:", error);
148
+ return;
149
+ }
150
+ if (hasMore) {
151
+ await this.processNextJob();
152
+ }
153
+ }
154
+ async processExistingJobs() {
155
+ let hasJobs;
156
+ try {
157
+ hasJobs = await this.queue.hasJobs();
158
+ }
159
+ catch (error) {
160
+ console.error("Error checking for existing jobs:", error);
161
+ return;
162
+ }
163
+ if (hasJobs) {
164
+ // Start processing up to the number of executors
165
+ const promises = [];
166
+ for (let i = 0; i < Math.min(this.executors.length, 5); i++) {
167
+ promises.push(this.processNextJob());
168
+ }
169
+ try {
170
+ await Promise.all(promises);
171
+ }
172
+ catch (error) {
173
+ console.error("Error processing existing jobs:", error);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ //# sourceMappingURL=simple-job-executor-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-job-executor-manager.js","sourceRoot":"","sources":["../../../src/executor/simple-job-executor-manager.ts"],"names":[],"mappings":"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"}