@venizia/ignis-docs 0.2.0 → 0.2.1-1

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 (174) hide show
  1. package/README.md +14 -14
  2. package/content/best-practices/api-usage-examples.md +39 -19
  3. package/content/best-practices/architectural-patterns.md +24 -13
  4. package/content/best-practices/architecture-decisions.md +29 -16
  5. package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
  6. package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
  7. package/content/best-practices/code-style-standards/control-flow.md +33 -1
  8. package/content/best-practices/code-style-standards/documentation.md +28 -8
  9. package/content/best-practices/code-style-standards/function-patterns.md +15 -4
  10. package/content/best-practices/code-style-standards/index.md +7 -2
  11. package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
  12. package/content/best-practices/code-style-standards/route-definitions.md +9 -5
  13. package/content/best-practices/code-style-standards/tooling.md +14 -1
  14. package/content/best-practices/code-style-standards/type-safety.md +39 -6
  15. package/content/best-practices/common-pitfalls.md +59 -35
  16. package/content/best-practices/contribution-workflow.md +8 -4
  17. package/content/best-practices/data-modeling.md +78 -62
  18. package/content/best-practices/deployment-strategies.md +56 -19
  19. package/content/best-practices/error-handling.md +247 -153
  20. package/content/best-practices/index.md +6 -0
  21. package/content/best-practices/performance-optimization.md +26 -13
  22. package/content/best-practices/security-guidelines.md +35 -9
  23. package/content/best-practices/testing-strategies.md +7 -2
  24. package/content/best-practices/troubleshooting-tips.md +27 -17
  25. package/content/extensions/components/api-reference.md +109 -323
  26. package/content/extensions/components/authentication/api.md +489 -602
  27. package/content/extensions/components/authentication/errors.md +135 -498
  28. package/content/extensions/components/authentication/index.md +89 -801
  29. package/content/extensions/components/authentication/usage.md +231 -955
  30. package/content/extensions/components/authorization/api.md +991 -644
  31. package/content/extensions/components/authorization/errors.md +204 -208
  32. package/content/extensions/components/authorization/getting-started.md +227 -0
  33. package/content/extensions/components/authorization/index.md +88 -795
  34. package/content/extensions/components/authorization/usage.md +219 -528
  35. package/content/extensions/components/health-check.md +77 -243
  36. package/content/extensions/components/index.md +24 -90
  37. package/content/extensions/components/mail/api.md +553 -285
  38. package/content/extensions/components/mail/errors.md +76 -62
  39. package/content/extensions/components/mail/index.md +111 -463
  40. package/content/extensions/components/mail/usage.md +139 -173
  41. package/content/extensions/components/request-tracker.md +70 -173
  42. package/content/extensions/components/socket-io/api.md +462 -785
  43. package/content/extensions/components/socket-io/errors.md +49 -51
  44. package/content/extensions/components/socket-io/index.md +69 -372
  45. package/content/extensions/components/socket-io/usage.md +212 -105
  46. package/content/extensions/components/static-asset/api.md +461 -141
  47. package/content/extensions/components/static-asset/errors.md +121 -53
  48. package/content/extensions/components/static-asset/index.md +84 -606
  49. package/content/extensions/components/static-asset/usage.md +184 -299
  50. package/content/extensions/components/template/index.md +3 -3
  51. package/content/extensions/components/websocket/api.md +311 -404
  52. package/content/extensions/components/websocket/errors.md +47 -56
  53. package/content/extensions/components/websocket/index.md +75 -407
  54. package/content/extensions/components/websocket/usage.md +120 -338
  55. package/content/extensions/helpers/cron/index.md +52 -160
  56. package/content/extensions/helpers/crypto/index.md +67 -480
  57. package/content/extensions/helpers/crypto/reference.md +528 -0
  58. package/content/extensions/helpers/env/index.md +64 -178
  59. package/content/extensions/helpers/error/index.md +286 -196
  60. package/content/extensions/helpers/index.md +61 -47
  61. package/content/extensions/helpers/inversion/index.md +76 -550
  62. package/content/extensions/helpers/inversion/reference.md +530 -0
  63. package/content/extensions/helpers/kafka/admin.md +23 -3
  64. package/content/extensions/helpers/kafka/compile-binary.md +83 -52
  65. package/content/extensions/helpers/kafka/consumer.md +65 -28
  66. package/content/extensions/helpers/kafka/examples.md +46 -253
  67. package/content/extensions/helpers/kafka/index.md +55 -617
  68. package/content/extensions/helpers/kafka/producer.md +156 -22
  69. package/content/extensions/helpers/kafka/schema-registry.md +59 -79
  70. package/content/extensions/helpers/logger/hf-logger.md +220 -0
  71. package/content/extensions/helpers/logger/index.md +78 -552
  72. package/content/extensions/helpers/logger/pino.md +105 -0
  73. package/content/extensions/helpers/logger/reference.md +937 -0
  74. package/content/extensions/helpers/network/api.md +276 -195
  75. package/content/extensions/helpers/network/index.md +87 -524
  76. package/content/extensions/helpers/queue/index.md +80 -897
  77. package/content/extensions/helpers/queue/reference.md +494 -0
  78. package/content/extensions/helpers/redis/index.md +86 -640
  79. package/content/extensions/helpers/redis/reference.md +784 -0
  80. package/content/extensions/helpers/secrets/index.md +136 -0
  81. package/content/extensions/helpers/socket-io/api.md +325 -204
  82. package/content/extensions/helpers/socket-io/index.md +79 -429
  83. package/content/extensions/helpers/storage/api.md +584 -464
  84. package/content/extensions/helpers/storage/index.md +80 -573
  85. package/content/extensions/helpers/types/index.md +75 -495
  86. package/content/extensions/helpers/types/reference.md +689 -0
  87. package/content/extensions/helpers/uid/index.md +176 -189
  88. package/content/extensions/helpers/websocket/api.md +366 -214
  89. package/content/extensions/helpers/websocket/index.md +68 -503
  90. package/content/extensions/helpers/worker-thread/index.md +62 -396
  91. package/content/extensions/helpers/worker-thread/reference.md +428 -0
  92. package/content/extensions/index.md +38 -39
  93. package/content/extensions/src-details/mcp-server.md +96 -548
  94. package/content/guides/core-concepts/persistent/datasources.md +2 -2
  95. package/content/guides/core-concepts/persistent/index.md +5 -1
  96. package/content/guides/core-concepts/persistent/models.md +1 -1
  97. package/content/guides/core-concepts/persistent/pglite.md +218 -0
  98. package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
  99. package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
  100. package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
  101. package/content/guides/core-concepts/persistent/sqlite.md +296 -0
  102. package/content/guides/core-concepts/persistent/transactions.md +12 -11
  103. package/content/guides/core-concepts/secrets-vault.md +177 -0
  104. package/content/guides/core-concepts/services.md +1 -1
  105. package/content/guides/get-started/5-minute-quickstart.md +59 -206
  106. package/content/guides/get-started/philosophy.md +135 -670
  107. package/content/guides/get-started/setup.md +53 -74
  108. package/content/guides/migrations/redis-helpers-migration.md +5 -4
  109. package/content/guides/migrations/scoped-rbac-migration.md +5 -5
  110. package/content/guides/migrations/unified-connectors-migration.md +8 -7
  111. package/content/guides/tutorials/ecommerce-api.md +3 -8
  112. package/content/guides/tutorials/realtime-chat.md +1 -1
  113. package/content/references/base/application.md +64 -22
  114. package/content/references/base/components.md +3 -3
  115. package/content/references/base/connectors.md +79 -136
  116. package/content/references/base/controllers.md +12 -12
  117. package/content/references/base/datasources-reference.md +600 -0
  118. package/content/references/base/datasources.md +84 -444
  119. package/content/references/base/dependency-injection.md +25 -46
  120. package/content/references/base/filter-system/application-usage.md +95 -123
  121. package/content/references/base/filter-system/array-operators.md +33 -43
  122. package/content/references/base/filter-system/comparison-operators.md +55 -63
  123. package/content/references/base/filter-system/default-filter.md +144 -350
  124. package/content/references/base/filter-system/fields-order-pagination.md +116 -148
  125. package/content/references/base/filter-system/index.md +114 -253
  126. package/content/references/base/filter-system/json-filtering.md +52 -181
  127. package/content/references/base/filter-system/list-operators.md +28 -44
  128. package/content/references/base/filter-system/logical-operators.md +69 -114
  129. package/content/references/base/filter-system/null-operators.md +41 -98
  130. package/content/references/base/filter-system/pattern-matching.md +48 -51
  131. package/content/references/base/filter-system/quick-reference.md +93 -196
  132. package/content/references/base/filter-system/range-operators.md +22 -38
  133. package/content/references/base/filter-system/tips.md +70 -133
  134. package/content/references/base/filter-system/use-cases.md +173 -232
  135. package/content/references/base/grpc-controllers.md +53 -17
  136. package/content/references/base/index.md +5 -3
  137. package/content/references/base/middlewares.md +43 -28
  138. package/content/references/base/models-reference.md +886 -0
  139. package/content/references/base/models.md +81 -1452
  140. package/content/references/base/providers.md +8 -8
  141. package/content/references/base/repositories/advanced.md +281 -419
  142. package/content/references/base/repositories/index.md +84 -644
  143. package/content/references/base/repositories/mixins.md +25 -21
  144. package/content/references/base/repositories/relations.md +194 -375
  145. package/content/references/base/repositories/soft-deletable.md +67 -55
  146. package/content/references/base/secrets.md +267 -0
  147. package/content/references/base/services.md +8 -6
  148. package/content/references/configuration/environment-variables.md +73 -21
  149. package/content/references/configuration/index.md +51 -31
  150. package/content/references/index.md +1 -1
  151. package/content/references/quick-reference.md +3 -16
  152. package/content/references/utilities/crypto.md +35 -76
  153. package/content/references/utilities/date.md +33 -73
  154. package/content/references/utilities/duration.md +85 -0
  155. package/content/references/utilities/index.md +6 -2
  156. package/content/references/utilities/jsx-reference.md +298 -0
  157. package/content/references/utilities/jsx.md +82 -525
  158. package/content/references/utilities/module.md +81 -61
  159. package/content/references/utilities/parse.md +34 -64
  160. package/content/references/utilities/performance.md +33 -58
  161. package/content/references/utilities/promise.md +28 -62
  162. package/content/references/utilities/request.md +58 -218
  163. package/content/references/utilities/retry.md +139 -0
  164. package/content/references/utilities/schema.md +43 -137
  165. package/content/references/utilities/statuses-reference.md +361 -0
  166. package/content/references/utilities/statuses.md +63 -667
  167. package/dist/mcp-server/index.js +0 -0
  168. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  169. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
  170. package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
  171. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  172. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
  173. package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
  174. package/package.json +24 -23
@@ -0,0 +1,428 @@
1
+ ---
2
+ title: Worker Thread - Full Reference
3
+ description: Complete reference for WorkerPoolHelper, BaseWorkerHelper, BaseWorkerThreadHelper, BaseWorkerBusHelper, and every constructor option and error message
4
+ difficulty: intermediate
5
+ ---
6
+
7
+ # Worker Thread - Full Reference
8
+
9
+ Exhaustive reference for the worker-thread classes, every constructor option, event-handler default, and troubleshooting case. For a readable introduction and the common tasks, start with the [Worker Thread overview](/extensions/helpers/worker-thread/).
10
+
11
+ **Files:**
12
+
13
+ - [`packages/helpers/src/modules/worker-thread/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/base.ts) - `AbstractWorkerHelper`, `BaseWorkerHelper`, `AbstractWorkerThreadHelper`, `BaseWorkerThreadHelper`
14
+ - [`packages/helpers/src/modules/worker-thread/worker-bus.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/worker-bus.ts) - `AbstractWorkerBusHelper`, `BaseWorkerBusHelper`, `AbstractWorkerMessageBusHandlerHelper`, `BaseWorkerMessageBusHandlerHelper`
15
+ - [`packages/helpers/src/modules/worker-thread/worker-pool.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/worker-pool.ts) - `WorkerPoolHelper`
16
+ - [`packages/helpers/src/modules/worker-thread/types.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/types.ts) - `IWorker`, `IWorkerThread`, `IWorkerBus`, `IWorkerMessageBusHandler`
17
+ - [`packages/helpers/src/modules/worker-thread/index.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/index.ts) - barrel
18
+
19
+ ## Quick Reference
20
+
21
+ | Class | Extends | Use case |
22
+ |-------|---------|----------|
23
+ | [`WorkerPoolHelper`](#workerpoolhelper) | `BaseHelper` | Singleton registry that tracks and limits active worker instances |
24
+ | [`BaseWorkerHelper<MessageType>`](#baseworkerhelper-main-thread-worker-wrapper) | `AbstractWorkerHelper<MessageType>` | Wraps a `Worker` with event lifecycle hooks - online, exit, error, message |
25
+ | [`BaseWorkerThreadHelper`](#baseworkerthreadhelper-inside-a-worker-thread) | `AbstractWorkerThreadHelper` | Runs inside a worker thread. Manages named `WorkerBus` channels |
26
+ | [`BaseWorkerBusHelper<IConsumePayload, IPublishPayload>`](#baseworkerbushelper-messageport-communication) | `AbstractWorkerBusHelper<IConsumePayload, IPublishPayload>` | Bidirectional `MessagePort` communication with pre/post hooks |
27
+ | [`BaseWorkerMessageBusHandlerHelper<IConsumePayload>`](#baseworkermessagebushandlerhelper) | `AbstractWorkerMessageBusHandlerHelper<IConsumePayload>` | Defines event handlers for a worker bus - message, close, error, exit |
28
+
29
+ | Item | Value |
30
+ |------|-------|
31
+ | **Package** | `@venizia/ignis-helpers` |
32
+ | **Peer Dependency** | None (uses built-in `node:worker_threads`) |
33
+ | **Runtimes** | Node.js (uses `node:worker_threads` and `node:os`) |
34
+
35
+ ### Import paths
36
+
37
+ ```typescript
38
+ import {
39
+ WorkerPoolHelper,
40
+ BaseWorkerHelper,
41
+ BaseWorkerThreadHelper,
42
+ BaseWorkerBusHelper,
43
+ BaseWorkerMessageBusHandlerHelper,
44
+ AbstractWorkerHelper,
45
+ AbstractWorkerThreadHelper,
46
+ AbstractWorkerBusHelper,
47
+ AbstractWorkerMessageBusHandlerHelper,
48
+ } from '@venizia/ignis-helpers';
49
+
50
+ import type {
51
+ IWorker,
52
+ IWorkerThread,
53
+ IWorkerBus,
54
+ IWorkerMessageBusHandler,
55
+ } from '@venizia/ignis-helpers';
56
+ ```
57
+
58
+ ## WorkerPoolHelper
59
+
60
+ `Source ->` [`worker-pool.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/worker-pool.ts)
61
+
62
+ Singleton registry for active workers. Limits the pool size to the number of CPU cores by default.
63
+
64
+ ```typescript
65
+ import { WorkerPoolHelper } from '@venizia/ignis-helpers';
66
+
67
+ // Get the singleton instance
68
+ const pool = WorkerPoolHelper.getInstance();
69
+
70
+ // Or construct a custom instance directly
71
+ const customPool = new WorkerPoolHelper({ ignoreMaxWarning: true });
72
+ ```
73
+
74
+ > [!NOTE]
75
+ > `WorkerPoolHelper.getInstance()` always creates the singleton with `ignoreMaxWarning: false`. To override this, construct a new instance manually. The singleton and a manually-constructed instance are independent registries.
76
+
77
+ ### Constructor options
78
+
79
+ | Option | Type | Default | Description |
80
+ |--------|------|---------|-------------|
81
+ | `ignoreMaxWarning` | `boolean` | `false` | When `true`, allows registering workers beyond the CPU core count. When `false`, registration is skipped once the pool reaches the CPU core limit. |
82
+
83
+ ### Methods
84
+
85
+ | Method | Signature | Description |
86
+ |--------|-----------|-------------|
87
+ | `getInstance` | `static getInstance(): WorkerPoolHelper` | Returns the singleton pool instance (creates one with `ignoreMaxWarning: false` if needed) |
88
+ | `register` | `register<MessageType>(opts: { key: string; worker: IWorker<MessageType> }): boolean` | Adds a worker to the pool. Returns `false` and logs, without registering, if the key exists or the pool is full |
89
+ | `unregister` | `async unregister(opts: { key: string }): Promise<void>` | Terminates the worker (`worker.terminate()`) and removes it from the pool. The registry entry is deleted even if termination throws |
90
+ | `get` | `get<MessageType>(opts: { key: string }): IWorker<MessageType> \| undefined` | Retrieves a registered worker by key |
91
+ | `has` | `has(opts: { key: string }): boolean` | Checks if a worker is registered under the given key |
92
+ | `size` | `size(): number` | Returns the number of currently registered workers |
93
+
94
+ > [!WARNING]
95
+ > When the pool reaches the CPU core limit and `ignoreMaxWarning` is `false`, further `register()` calls return `false` and log a warning. No error is thrown.
96
+
97
+ ## BaseWorkerHelper (main thread worker wrapper)
98
+
99
+ `Source ->` [`base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/base.ts)
100
+
101
+ Creates a `Worker` from a file path and automatically binds all lifecycle events.
102
+
103
+ ```typescript
104
+ import { BaseWorkerHelper } from '@venizia/ignis-helpers';
105
+
106
+ const worker = new BaseWorkerHelper<MyMessageType>({
107
+ identifier: 'data-processor',
108
+ path: './workers/data-processor.js',
109
+ options: { workerData: { batchSize: 100 } },
110
+ eventHandlers: {
111
+ onMessage: opts => console.log('Received:', opts.message),
112
+ onError: opts => console.error('Worker error:', opts.error),
113
+ },
114
+ });
115
+ ```
116
+
117
+ ### Constructor options
118
+
119
+ | Option | Type | Default | Description |
120
+ |--------|------|---------|-------------|
121
+ | `identifier` | `string` | - | A unique name for this worker instance, used as the `BaseHelper` identifier and in log output. Required. |
122
+ | `path` | `string \| URL` | - | Path to the worker script file, passed directly to `new Worker()`. Required. |
123
+ | `options` | `WorkerOptions` (Node.js) | - | Passed directly to `new Worker()`. Required. Supports `workerData`, `transferList`, `env`, etc. |
124
+ | `scope` | `string` | `'BaseWorkerHelper'` | Accepted but currently ignored - the constructor always sets the logger scope to `BaseWorkerHelper.name`, not `opts.scope`. |
125
+ | `eventHandlers` | `Partial<Pick<IWorker<MessageType>, 'onOnline' \| 'onExit' \| 'onError' \| 'onMessage' \| 'onMessageError'>>` | `undefined` | Optional overrides for lifecycle event callbacks. Any handler not provided falls back to default logging behavior. |
126
+
127
+ ### Event handler overrides
128
+
129
+ | Handler | Signature | Default behavior |
130
+ |---------|-----------|-------------------|
131
+ | `onOnline` | `() => ValueOrPromise<void>` | Logs `"Worker ONLINE"` at info level |
132
+ | `onExit` | `(opts: { code: string \| number }) => ValueOrPromise<void>` | Logs `"Worker EXIT | Code: %s"` at warn level |
133
+ | `onError` | `(opts: { error: Error }) => ValueOrPromise<void>` | Logs `"Worker ERROR | Error: %s"` at error level |
134
+ | `onMessage` | `(opts: { message: MessageType }) => ValueOrPromise<void>` | Logs `"Worker MESSAGE | message: %j"` at error level |
135
+ | `onMessageError` | `(opts: { error: Error }) => ValueOrPromise<void>` | Logs `"Worker MESSAGE_ERROR | Error: %s"` at error level |
136
+
137
+ ### Methods
138
+
139
+ | Method | Signature | Description |
140
+ |--------|-----------|-------------|
141
+ | `binding` | `binding(): void` | Binds all five event handlers to the internal `Worker` instance. Called automatically by the constructor. Throws `[binding] Invalid worker instance to bind event handlers` if `this.worker` is falsy |
142
+
143
+ Every handler runs through `invokeHook`, which wraps the call in a `try/catch`. A synchronous throw inside a user handler is caught and logged as `"Hook execution FAILED | Error: %s"`, rather than crashing the process. Async rejections are settled the same way, via `voidExecution`.
144
+
145
+ ### AbstractWorkerHelper (subclassing)
146
+
147
+ For full control, extend `AbstractWorkerHelper` and implement all five lifecycle methods directly instead of passing `eventHandlers`:
148
+
149
+ ```typescript
150
+ import { AbstractWorkerHelper } from '@venizia/ignis-helpers';
151
+
152
+ class CustomWorker extends AbstractWorkerHelper<MyMessage> {
153
+ onOnline() {
154
+ // Custom online handling
155
+ }
156
+
157
+ onExit(opts: { code: string | number }) {
158
+ // Custom exit handling - for example, restart logic
159
+ }
160
+
161
+ onError(opts: { error: Error }) {
162
+ // Custom error handling
163
+ }
164
+
165
+ onMessage(opts: { message: MyMessage }) {
166
+ // Custom message processing
167
+ }
168
+
169
+ onMessageError(opts: { error: Error }) {
170
+ // Custom message error handling
171
+ }
172
+ }
173
+ ```
174
+
175
+ `AbstractWorkerHelper<MessageType>` declares `worker: Worker`, `options: WorkerOptions`, and the five abstract lifecycle methods above. It does not implement `binding()` itself.
176
+
177
+ ## BaseWorkerThreadHelper (inside a worker thread)
178
+
179
+ `Source ->` [`base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/base.ts)
180
+
181
+ Used inside a worker script to manage named communication buses. Must be instantiated from within a worker thread. Constructing it on the main thread throws.
182
+
183
+ ```typescript
184
+ // Inside worker-script.js
185
+ import { BaseWorkerThreadHelper } from '@venizia/ignis-helpers';
186
+
187
+ const thread = new BaseWorkerThreadHelper({ scope: 'DataProcessor' });
188
+ ```
189
+
190
+ ### Constructor options
191
+
192
+ | Option | Type | Default | Description |
193
+ |--------|------|---------|-------------|
194
+ | `scope` | `string` | - | Logger scope and `BaseHelper` identifier for this worker thread. Required. |
195
+
196
+ The constructor checks `isMainThread` (from `node:worker_threads`) and throws `[BaseWorker] Cannot start worker in MAIN_THREAD` if `true`.
197
+
198
+ ### Methods
199
+
200
+ | Method | Signature | Description |
201
+ |--------|-----------|-------------|
202
+ | `bindWorkerBus` | `bindWorkerBus<IC, IP>(opts: { key: string; bus: IWorkerBus<IC, IP> }): void` | Registers a bus under the given key. Logs a warning and returns without overwriting if the key already exists |
203
+ | `unbindWorkerBus` | `unbindWorkerBus(opts: { key: string }): void` | Calls `port.removeAllListeners()` on the bus's port, then deletes it from the registry. Logs a warning if the key is not found |
204
+ | `getWorkerBus` | `getWorkerBus<IC, IP>(opts: { key: string }): IWorkerBus<IC, IP>` | Returns the bus for the given key. Throws `[getWorkerBus] Not found worker bus | key: {key}` if not found |
205
+
206
+ `unbindWorkerBus` is defined only on `BaseWorkerThreadHelper`, not on the `AbstractWorkerThreadHelper` interface. `AbstractWorkerThreadHelper` declares `buses`, `bindWorkerBus`, and `getWorkerBus` as abstract members only.
207
+
208
+ ## BaseWorkerMessageBusHandlerHelper
209
+
210
+ `Source ->` [`worker-bus.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/worker-bus.ts)
211
+
212
+ Defines the event callbacks for a worker bus.
213
+
214
+ ```typescript
215
+ const handler = new BaseWorkerMessageBusHandlerHelper<MyPayload>({
216
+ scope: 'ProcessorHandler',
217
+ onMessage: opts => console.log('Processing:', opts.message),
218
+ onError: opts => console.error('Bus error:', opts.error),
219
+ });
220
+ ```
221
+
222
+ ### Constructor options
223
+
224
+ | Option | Type | Default | Description |
225
+ |--------|------|---------|-------------|
226
+ | `scope` | `string` | - | Logger scope and identifier. Required. |
227
+ | `onMessage` | `(opts: { message: IConsumePayload }) => ValueOrPromise<void>` | - | Handler called when a message is received on the port. Required. |
228
+ | `onClose` | `() => ValueOrPromise<void>` | No-op `() => {}` | Handler called when the port emits `close`. |
229
+ | `onError` | `(opts: { error: Error }) => ValueOrPromise<void>` | Logs `"worker error: %s"` at error level | Handler called on port `error` and `messageerror` events. |
230
+ | `onExit` | `(opts: { exitCode: number \| string }) => ValueOrPromise<void>` | Logs `"worker EXITED | exitCode: %s"` at warn level | Handler called when the port emits `exit`. |
231
+
232
+ ## BaseWorkerBusHelper (MessagePort communication)
233
+
234
+ `Source ->` [`worker-bus.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/worker-bus.ts)
235
+
236
+ Wraps a `MessagePort` to provide structured bidirectional messaging with lifecycle event handlers.
237
+
238
+ ```typescript
239
+ import { BaseWorkerBusHelper, BaseWorkerMessageBusHandlerHelper } from '@venizia/ignis-helpers';
240
+ import { parentPort } from 'node:worker_threads';
241
+
242
+ const handler = new BaseWorkerMessageBusHandlerHelper<IncomingMessage>({
243
+ scope: 'MyBusHandler',
244
+ onMessage: opts => console.log('Received:', opts.message),
245
+ });
246
+
247
+ const bus = new BaseWorkerBusHelper<IncomingMessage, OutgoingMessage>({
248
+ scope: 'MyBus',
249
+ port: parentPort!,
250
+ busHandler: handler,
251
+ });
252
+ ```
253
+
254
+ ### Constructor options
255
+
256
+ | Option | Type | Default | Description |
257
+ |--------|------|---------|-------------|
258
+ | `scope` | `string` | - | Logger scope and identifier. Required. |
259
+ | `port` | `MessagePort` | - | The `MessagePort` to bind for communication. Required. |
260
+ | `busHandler` | `IWorkerMessageBusHandler<IConsumePayload>` | - | Handler that receives incoming messages and lifecycle events. Required. |
261
+
262
+ The constructor binds `message`, `error`, `messageerror`, `exit`, and `close` listeners on `port`. Each routes to the handler's matching callback. `error` and `messageerror` both route to `handler.onError`.
263
+
264
+ ### Methods
265
+
266
+ | Method | Signature | Description |
267
+ |--------|-----------|-------------|
268
+ | `postMessage` | `postMessage(opts: { message: IPublishPayload; transferList: readonly Transferable[] \| undefined }): ValueOrPromise<void>` | Sends a message through the port. Calls `port.postMessage(message, [...transferList])` if `transferList` is set, otherwise `port.postMessage(message)`. Logs and returns, without throwing, if `port` is falsy |
269
+
270
+ ### Pre/post message hooks
271
+
272
+ `onBeforePostMessage` and `onAfterPostMessage` are optional properties declared on the class. The constructor leaves them `undefined`. Assign them yourself, after construction:
273
+
274
+ ```typescript
275
+ bus.onBeforePostMessage = opts => {
276
+ console.log('About to send:', opts.message);
277
+ };
278
+
279
+ bus.onAfterPostMessage = opts => {
280
+ console.log('Sent:', opts.message);
281
+ };
282
+ ```
283
+
284
+ `postMessage` invokes `onBeforePostMessage` before the port write, if set. It invokes `onAfterPostMessage` after the write, if set. Both hooks run through the same `try/catch`-wrapped `invokeHook` used for the port event listeners.
285
+
286
+ ### Sending transferable objects
287
+
288
+ ```typescript
289
+ // Send a simple message
290
+ bus.postMessage({
291
+ message: { result: 'processed' },
292
+ transferList: undefined,
293
+ });
294
+
295
+ // Send with transferable objects (zero-copy)
296
+ const buffer = new ArrayBuffer(1024);
297
+ bus.postMessage({
298
+ message: { result: 'binary-data' },
299
+ transferList: [buffer],
300
+ });
301
+ ```
302
+
303
+ ## Types
304
+
305
+ `Source ->` [`types.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/worker-thread/types.ts)
306
+
307
+ ```typescript
308
+ interface IWorker<MessageType> {
309
+ worker: Worker;
310
+ options: WorkerOptions;
311
+
312
+ onOnline(): ValueOrPromise<void>;
313
+ onExit(opts: { code: string | number }): ValueOrPromise<void>;
314
+ onError(opts: { error: Error }): ValueOrPromise<void>;
315
+ onMessage(opts: { message: MessageType }): ValueOrPromise<void>;
316
+ onMessageError(opts: { error: Error }): ValueOrPromise<void>;
317
+ }
318
+
319
+ interface IWorkerThread {
320
+ buses: { [workerKey: string | symbol]: IWorkerBus<AnyType, AnyType> };
321
+ }
322
+
323
+ interface IWorkerMessageBusHandler<IConsumePayload> {
324
+ onMessage: (opts: { message: IConsumePayload }) => ValueOrPromise<void>;
325
+ onClose: () => ValueOrPromise<void>;
326
+ onError: (opts: { error: Error }) => ValueOrPromise<void>;
327
+ onExit: (opts: { exitCode: number | string }) => ValueOrPromise<void>;
328
+ }
329
+
330
+ interface IWorkerBus<IConsumePayload, IPublishPayload> {
331
+ port: MessagePort;
332
+ handler: IWorkerMessageBusHandler<IConsumePayload>;
333
+
334
+ onBeforePostMessage?(opts: { message: IPublishPayload }): ValueOrPromise<void>;
335
+ onAfterPostMessage?(opts: { message: IPublishPayload }): ValueOrPromise<void>;
336
+ postMessage(opts: {
337
+ message: IPublishPayload;
338
+ transferList: readonly Transferable[] | undefined;
339
+ }): ValueOrPromise<void>;
340
+ }
341
+ ```
342
+
343
+ ## Troubleshooting
344
+
345
+ ### "[BaseWorker] Cannot start worker in MAIN_THREAD"
346
+
347
+ **Cause:** `BaseWorkerThreadHelper` was instantiated on the main thread. This class is designed to run only inside a worker thread (where `isMainThread` from `node:worker_threads` is `false`).
348
+
349
+ **Fix:** Only create `BaseWorkerThreadHelper` instances inside worker scripts that are spawned via `new Worker(path)`:
350
+
351
+ ```typescript
352
+ // worker-script.js (spawned by the main thread)
353
+ import { BaseWorkerThreadHelper } from '@venizia/ignis-helpers';
354
+
355
+ const thread = new BaseWorkerThreadHelper({ scope: 'MyWorker' }); // OK here
356
+ ```
357
+
358
+ ### "[binding] Invalid worker instance to bind event handlers"
359
+
360
+ **Cause:** `BaseWorkerHelper.binding()` was called but the internal `Worker` instance is falsy. This can occur if the worker script path is invalid and the `Worker` constructor fails.
361
+
362
+ **Fix:** Ensure the `path` passed to `BaseWorkerHelper` points to a valid, existing JavaScript file:
363
+
364
+ ```typescript
365
+ const worker = new BaseWorkerHelper({
366
+ identifier: 'my-worker',
367
+ path: './workers/my-worker.js', // Must exist and be a valid worker script
368
+ options: {},
369
+ });
370
+ ```
371
+
372
+ ### "[register] Invalid worker registry instance | please init registry before register new worker!"
373
+
374
+ **Cause:** `WorkerPoolHelper.register()` was called but the internal registry `Map` is falsy. This is a defensive check that should not occur under normal usage.
375
+
376
+ **Fix:** Ensure you are using either `WorkerPoolHelper.getInstance()` or `new WorkerPoolHelper()`, both of which initialize the registry in the constructor.
377
+
378
+ ### "[getWorkerBus] Not found worker bus | key: {key}"
379
+
380
+ **Cause:** `BaseWorkerThreadHelper.getWorkerBus()` was called with a key that has not been registered via `bindWorkerBus()`.
381
+
382
+ **Fix:** Verify the bus was bound before retrieving it:
383
+
384
+ ```typescript
385
+ thread.bindWorkerBus({ key: 'my-bus', bus: myBus });
386
+
387
+ // Now safe to retrieve
388
+ const bus = thread.getWorkerBus({ key: 'my-bus' });
389
+ ```
390
+
391
+ ### "Failed to post message to main | Invalid parentPort!"
392
+
393
+ **Cause:** `BaseWorkerBusHelper.postMessage()` was called but the `port` property is falsy. This typically means the bus was constructed with an invalid `MessagePort`. This is logged at error level, not thrown. The message is silently dropped.
394
+
395
+ **Fix:** Ensure a valid `MessagePort` is passed to the constructor - for example `parentPort` from `node:worker_threads`, or a port from `new MessageChannel()`:
396
+
397
+ ```typescript
398
+ import { parentPort } from 'node:worker_threads';
399
+
400
+ const bus = new BaseWorkerBusHelper({
401
+ scope: 'MyBus',
402
+ port: parentPort!, // Must be a valid MessagePort
403
+ busHandler: handler,
404
+ });
405
+ ```
406
+
407
+ ### Worker pool silently skips registration
408
+
409
+ **Cause:** The pool has reached the CPU core limit and `ignoreMaxWarning` is `false` (the default for `getInstance()`). `register()` returns `false` and logs a warning instead of throwing.
410
+
411
+ **Fix:** Either free up pool slots first, or create a pool with `ignoreMaxWarning: true`:
412
+
413
+ ```typescript
414
+ // Option 1: Free up pool slots
415
+ await pool.unregister({ key: 'old-worker' });
416
+ pool.register({ key: 'new-worker', worker: newWorker });
417
+
418
+ // Option 2: Allow exceeding the limit
419
+ const pool = new WorkerPoolHelper({ ignoreMaxWarning: true });
420
+ ```
421
+
422
+ ## See also
423
+
424
+ - [Worker Thread overview](/extensions/helpers/worker-thread/) - introduction and the most common tasks
425
+ - [Queue Helper](/extensions/helpers/queue/) - message-queue processing as an alternative to worker threads
426
+ - [Node.js Worker Threads](https://nodejs.org/api/worker_threads.html) - official `worker_threads` documentation
427
+ - [MessagePort API](https://nodejs.org/api/worker_threads.html#class-messageport) - underlying port communication
428
+ - [Transferable Objects](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects) - zero-copy data transfer
@@ -1,47 +1,46 @@
1
1
  # Extensions
2
2
 
3
- Extensions are optional packages and built-in modules that add functionality on top of the IGNIS core framework. They are organized into two categories:
3
+ Optional pieces you add on top of IGNIS core: components you register once, helpers you inject where you need them.
4
4
 
5
5
  ## Components
6
6
 
7
- Components are self-contained feature modules that plug into your application via the `this.component()` registration method. Each component encapsulates its own bindings, controllers, and configuration.
8
-
9
- | Component | Description | Key Features |
10
- | :--- | :--- | :--- |
11
- | [Authentication](./components/authentication/) | Identity verification | JWT, Basic, JWKS strategies |
12
- | [Authorization](./components/authorization/) | Access control | Casbin-based RBAC, per-route policies |
13
- | [Health Check](./components/health-check) | Liveness check | `GET /health`, `POST /health/ping` |
14
- | [Mail](./components/mail/) | Email delivery | Nodemailer, Mailgun, queue support |
15
- | [Request Tracker](./components/request-tracker) | Request tracing | `x-request-id` header, body parsing |
16
- | [Socket.IO](./components/socket-io/) | Real-time (Socket.IO) | Redis adapter, room-based messaging |
17
- | [Static Asset](./components/static-asset/) | File management | Upload/download, MinIO, Disk, BunS3 |
18
- | [Swagger](./components/api-reference) | API docs | OpenAPI UI, Swagger UI, Scalar UI |
19
- | [WebSocket](./components/websocket/) | Real-time (native) | Bun native WebSocket, encryption |
7
+ | Component | What it does | When you reach for it |
8
+ |---|---|---|
9
+ | [Authentication](./components/authentication/) | Verifies who is calling - JWT, Basic, JWKS strategies | A route needs to know who the caller is |
10
+ | [Authorization](./components/authorization/) | Casbin-based RBAC, per-route policies | A route needs a permission check beyond authentication |
11
+ | [Health Check](./components/health-check) | `GET /health` and `POST /health/ping` | A load balancer or Kubernetes needs a liveness probe |
12
+ | [Mail](./components/mail/) | Sends email via Nodemailer, Mailgun, or a queue | The app sends transactional or templated email |
13
+ | [Request Tracker](./components/request-tracker) | Tags every request with an ID, logs method/path/timing | Always on - registered automatically, nothing to configure |
14
+ | [Socket.IO](./components/socket-io/) | Real-time messaging over Socket.IO, Redis adapter | Clients need rooms or Socket.IO-specific features |
15
+ | [Static Asset](./components/static-asset/) | Upload/download files - MinIO, disk, or Bun S3 | The app stores or serves user-uploaded files |
16
+ | [API Reference](./components/api-reference) | Interactive OpenAPI docs, Scalar UI by default | You want a browsable UI for your REST routes |
17
+ | [WebSocket](./components/websocket/) | Native Bun WebSocket, Redis pub/sub, heartbeat | Clients need a raw WebSocket without Socket.IO |
20
18
 
21
19
  ## Helpers
22
20
 
23
- Helpers are standalone utility classes for infrastructure concerns. They extend `BaseHelper` for scoped logging and are typically used via dependency injection.
24
-
25
- | Helper | Description | Peer Dependencies |
26
- | :--- | :--- | :--- |
27
- | [Cron](./helpers/cron/) | Scheduled tasks | `cron` |
28
- | [Crypto](./helpers/crypto/) | Encryption/signing | Built-in |
29
- | [Environment](./helpers/env/) | Env var management | Built-in |
30
- | [Error](./helpers/error/) | Error utilities | Built-in |
31
- | [Inversion](./helpers/inversion/) | DI container | Built-in |
32
- | [Logger](./helpers/logger/) | Logging | `winston` |
33
- | [Network](./helpers/network/) | HTTP/TCP/UDP clients | `axios` (optional) |
34
- | [Kafka](./helpers/kafka/) | Kafka messaging | `@platformatic/kafka` |
35
- | [Queue](./helpers/queue/) | Job queues | `bullmq`, `mqtt` (optional) |
36
- | [Redis](./helpers/redis/) | Redis client | `ioredis` |
37
- | [Socket.IO](./helpers/socket-io/) | Socket.IO server | `socket.io` |
38
- | [Storage](./helpers/storage/) | File storage | `minio` (optional) |
39
- | [Types](./helpers/types/) | Shared types | Built-in |
40
- | [UID](./helpers/uid/) | Snowflake IDs | Built-in |
41
- | [WebSocket](./helpers/websocket/) | WebSocket server | Built-in |
42
- | [Worker Thread](./helpers/worker-thread/) | Worker pools | Built-in |
43
-
44
- ## See Also
45
-
46
- - [Core API](/references/) -- Base framework abstractions
47
- - [Guides](/guides/) -- Getting started and tutorials
21
+ Every peer dependency below is optional. You install one only when you use the helper that needs it.
22
+
23
+ | Helper | What it does | When you reach for it | Peer dependency |
24
+ |---|---|---|---|
25
+ | [Cron](./helpers/cron/) | Scheduled tasks | You run code on a cron schedule | `cron` |
26
+ | [Crypto](./helpers/crypto/) | Encryption and signing | You hash, encrypt, or sign data | None |
27
+ | [Environment](./helpers/env/) | Env var management | You need typed, validated env var access | None |
28
+ | [Error](./helpers/error/) | Error utilities | You throw or handle an error | None |
29
+ | [Inversion](./helpers/inversion/) | DI container | You build custom bindings or providers | None |
30
+ | [Logger](./helpers/logger/) | Logging | You need scoped, leveled logging | `winston` or `pino` |
31
+ | [Network](./helpers/network/) | HTTP/TCP/UDP clients | You call another service over HTTP, TCP, or UDP | `axios`, for the Axios client only |
32
+ | [Kafka](./helpers/kafka/) | Kafka messaging | You publish or consume Kafka topics | `@platformatic/kafka` |
33
+ | [Queue](./helpers/queue/) | Job queues | You need background or delayed work | `bullmq` or `mqtt` |
34
+ | [Redis](./helpers/redis/) | Redis client | You need a Redis connection - cache, pub/sub, locks | None - `ioredis` ships with the package |
35
+ | [Secrets](./helpers/secrets/) | Secret loading and rotation | You read secrets from Vault, dotenv, or the environment | `node-vault` or `@dotenvx/dotenvx` |
36
+ | [Socket.IO](./helpers/socket-io/) | Socket.IO server | You build a custom real-time feature | `socket.io` |
37
+ | [Storage](./helpers/storage/) | File storage | You read/write files to MinIO or disk directly | `minio`, for the MinIO backend only |
38
+ | [Types](./helpers/types/) | Shared types | You need IGNIS's shared TypeScript utility types | None |
39
+ | [UID](./helpers/uid/) | Snowflake IDs | You need unique, sortable IDs | None |
40
+ | [WebSocket](./helpers/websocket/) | WebSocket server | You build a custom real-time feature | None |
41
+ | [Worker Thread](./helpers/worker-thread/) | Worker pools | You move CPU-heavy work off the main thread | None |
42
+
43
+ ## See also
44
+
45
+ - [Core API](/references/) - Base framework abstractions
46
+ - [Guides](/guides/) - Getting started and tutorials