@venizia/ignis-docs 0.2.0 → 0.2.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) 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 +22 -11
  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 +26 -2
  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 +6 -2
  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 +182 -93
  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 +107 -322
  26. package/content/extensions/components/authentication/api.md +454 -603
  27. package/content/extensions/components/authentication/errors.md +121 -498
  28. package/content/extensions/components/authentication/index.md +88 -801
  29. package/content/extensions/components/authentication/usage.md +207 -956
  30. package/content/extensions/components/authorization/api.md +736 -656
  31. package/content/extensions/components/authorization/errors.md +168 -206
  32. package/content/extensions/components/authorization/index.md +82 -797
  33. package/content/extensions/components/authorization/usage.md +194 -527
  34. package/content/extensions/components/health-check.md +71 -243
  35. package/content/extensions/components/mail/api.md +504 -287
  36. package/content/extensions/components/mail/errors.md +73 -61
  37. package/content/extensions/components/mail/index.md +96 -467
  38. package/content/extensions/components/mail/usage.md +130 -172
  39. package/content/extensions/components/request-tracker.md +66 -173
  40. package/content/extensions/components/socket-io/api.md +195 -13
  41. package/content/extensions/components/socket-io/errors.md +3 -3
  42. package/content/extensions/components/socket-io/index.md +50 -337
  43. package/content/extensions/components/socket-io/usage.md +143 -26
  44. package/content/extensions/components/static-asset/api.md +410 -142
  45. package/content/extensions/components/static-asset/errors.md +110 -53
  46. package/content/extensions/components/static-asset/index.md +79 -608
  47. package/content/extensions/components/static-asset/usage.md +180 -300
  48. package/content/extensions/components/websocket/api.md +275 -399
  49. package/content/extensions/components/websocket/errors.md +47 -56
  50. package/content/extensions/components/websocket/index.md +74 -407
  51. package/content/extensions/components/websocket/usage.md +110 -341
  52. package/content/extensions/helpers/cron/index.md +51 -160
  53. package/content/extensions/helpers/crypto/index.md +62 -483
  54. package/content/extensions/helpers/crypto/reference.md +456 -0
  55. package/content/extensions/helpers/env/index.md +60 -178
  56. package/content/extensions/helpers/error/index.md +221 -207
  57. package/content/extensions/helpers/inversion/index.md +65 -556
  58. package/content/extensions/helpers/inversion/reference.md +522 -0
  59. package/content/extensions/helpers/kafka/admin.md +20 -1
  60. package/content/extensions/helpers/kafka/compile-binary.md +41 -35
  61. package/content/extensions/helpers/kafka/consumer.md +54 -20
  62. package/content/extensions/helpers/kafka/examples.md +21 -16
  63. package/content/extensions/helpers/kafka/index.md +80 -610
  64. package/content/extensions/helpers/kafka/producer.md +134 -5
  65. package/content/extensions/helpers/kafka/schema-registry.md +45 -70
  66. package/content/extensions/helpers/logger/hf-logger.md +193 -0
  67. package/content/extensions/helpers/logger/index.md +64 -563
  68. package/content/extensions/helpers/logger/pino.md +85 -0
  69. package/content/extensions/helpers/logger/reference.md +746 -0
  70. package/content/extensions/helpers/network/api.md +241 -195
  71. package/content/extensions/helpers/network/index.md +72 -530
  72. package/content/extensions/helpers/queue/index.md +72 -900
  73. package/content/extensions/helpers/queue/reference.md +467 -0
  74. package/content/extensions/helpers/redis/index.md +73 -645
  75. package/content/extensions/helpers/redis/reference.md +727 -0
  76. package/content/extensions/helpers/secrets/index.md +66 -0
  77. package/content/extensions/helpers/socket-io/api.md +305 -203
  78. package/content/extensions/helpers/socket-io/index.md +66 -432
  79. package/content/extensions/helpers/storage/api.md +564 -462
  80. package/content/extensions/helpers/storage/index.md +77 -573
  81. package/content/extensions/helpers/types/index.md +66 -499
  82. package/content/extensions/helpers/types/reference.md +650 -0
  83. package/content/extensions/helpers/uid/index.md +58 -227
  84. package/content/extensions/helpers/websocket/api.md +329 -216
  85. package/content/extensions/helpers/websocket/index.md +65 -503
  86. package/content/extensions/helpers/worker-thread/index.md +58 -396
  87. package/content/extensions/helpers/worker-thread/reference.md +428 -0
  88. package/content/guides/core-concepts/persistent/models.md +1 -1
  89. package/content/guides/core-concepts/persistent/search-typesense.md +3 -3
  90. package/content/guides/core-concepts/persistent/transactions.md +1 -1
  91. package/content/guides/core-concepts/secrets-vault.md +177 -0
  92. package/content/guides/core-concepts/services.md +1 -1
  93. package/content/guides/migrations/redis-helpers-migration.md +1 -1
  94. package/content/guides/migrations/unified-connectors-migration.md +2 -2
  95. package/content/guides/tutorials/ecommerce-api.md +3 -8
  96. package/content/references/base/application.md +1 -1
  97. package/content/references/base/connectors.md +79 -136
  98. package/content/references/base/datasources-reference.md +599 -0
  99. package/content/references/base/datasources.md +84 -444
  100. package/content/references/base/dependency-injection.md +17 -39
  101. package/content/references/base/filter-system/application-usage.md +69 -121
  102. package/content/references/base/filter-system/array-operators.md +12 -0
  103. package/content/references/base/filter-system/comparison-operators.md +12 -0
  104. package/content/references/base/filter-system/default-filter.md +136 -348
  105. package/content/references/base/filter-system/fields-order-pagination.md +38 -16
  106. package/content/references/base/filter-system/index.md +106 -257
  107. package/content/references/base/filter-system/json-filtering.md +12 -2
  108. package/content/references/base/filter-system/list-operators.md +16 -2
  109. package/content/references/base/filter-system/logical-operators.md +13 -0
  110. package/content/references/base/filter-system/null-operators.md +13 -0
  111. package/content/references/base/filter-system/pattern-matching.md +12 -0
  112. package/content/references/base/filter-system/quick-reference.md +11 -2
  113. package/content/references/base/filter-system/range-operators.md +12 -0
  114. package/content/references/base/filter-system/tips.md +70 -133
  115. package/content/references/base/filter-system/use-cases.md +156 -233
  116. package/content/references/base/middlewares.md +35 -21
  117. package/content/references/base/models-reference.md +886 -0
  118. package/content/references/base/models.md +80 -1452
  119. package/content/references/base/repositories/advanced.md +156 -192
  120. package/content/references/base/repositories/index.md +77 -650
  121. package/content/references/base/repositories/mixins.md +22 -18
  122. package/content/references/base/repositories/relations.md +123 -171
  123. package/content/references/base/repositories/soft-deletable.md +58 -56
  124. package/content/references/base/secrets.md +263 -0
  125. package/content/references/base/services.md +2 -2
  126. package/content/references/configuration/environment-variables.md +48 -4
  127. package/content/references/configuration/index.md +49 -31
  128. package/content/references/quick-reference.md +3 -16
  129. package/content/references/utilities/crypto.md +35 -76
  130. package/content/references/utilities/date.md +33 -73
  131. package/content/references/utilities/index.md +1 -1
  132. package/content/references/utilities/jsx-reference.md +298 -0
  133. package/content/references/utilities/jsx.md +82 -525
  134. package/content/references/utilities/module.md +29 -62
  135. package/content/references/utilities/parse.md +34 -64
  136. package/content/references/utilities/performance.md +33 -58
  137. package/content/references/utilities/promise.md +28 -62
  138. package/content/references/utilities/request.md +57 -218
  139. package/content/references/utilities/schema.md +43 -137
  140. package/content/references/utilities/statuses-reference.md +361 -0
  141. package/content/references/utilities/statuses.md +63 -667
  142. package/package.json +8 -8
@@ -1,12 +1,132 @@
1
1
  # Socket.IO -- Usage & Examples
2
2
 
3
- > Server-side usage patterns, client helper setup, and advanced examples.
3
+ > Full setup steps, server-side usage patterns, client helper, and advanced examples.
4
+
5
+ ## Full Setup
6
+
7
+ ### 1. Install Dependencies
8
+
9
+ ```bash
10
+ # Core dependency (already included via @venizia/ignis)
11
+ # ioredis is required for the Redis adapter
12
+
13
+ # For Bun runtime only -- optional peer dependency
14
+ bun add @socket.io/bun-engine
15
+ ```
16
+
17
+ ### 2. Bind Required + Optional Services
18
+
19
+ ```typescript
20
+ import { BaseApplication } from '@venizia/ignis';
21
+ import { SocketIOComponent, SocketIOBindingKeys } from '@venizia/ignis/socket-io';
22
+ import { RedisSingleHelper, ValueOrPromise } from '@venizia/ignis-helpers';
23
+ import type {
24
+ TSocketIOAuthenticateFn,
25
+ TSocketIOValidateRoomFn,
26
+ TSocketIOClientConnectedFn,
27
+ } from '@venizia/ignis-helpers/socket-io';
28
+
29
+ export class Application extends BaseApplication {
30
+ private redisHelper: RedisSingleHelper;
31
+
32
+ preConfigure(): ValueOrPromise<void> {
33
+ this.setupSocketIO();
34
+ // ... other setup
35
+ }
36
+
37
+ setupSocketIO() {
38
+ // 1. Redis connection (required for adapter + emitter)
39
+ this.redisHelper = new RedisSingleHelper({
40
+ name: 'socket-io-redis',
41
+ host: process.env.REDIS_HOST ?? 'localhost',
42
+ port: +(process.env.REDIS_PORT ?? 6379),
43
+ password: process.env.REDIS_PASSWORD,
44
+ autoConnect: false,
45
+ });
46
+
47
+ this.bind<RedisSingleHelper>({
48
+ key: SocketIOBindingKeys.REDIS_CONNECTION,
49
+ }).toValue(this.redisHelper);
50
+
51
+ // 2. Authentication handler (required)
52
+ const authenticateFn: TSocketIOAuthenticateFn = handshake => {
53
+ const token = handshake.headers.authorization;
54
+ // Implement your auth logic -- JWT verification, session check, etc.
55
+ return !!token;
56
+ };
57
+
58
+ this.bind<TSocketIOAuthenticateFn>({
59
+ key: SocketIOBindingKeys.AUTHENTICATE_HANDLER,
60
+ }).toValue(authenticateFn);
61
+
62
+ // 3. Room validation handler (optional -- joins rejected without this)
63
+ const validateRoomFn: TSocketIOValidateRoomFn = ({ socket, rooms }) => {
64
+ // Return the rooms that the client is allowed to join
65
+ const allowedRooms = rooms.filter(room => room.startsWith('public-'));
66
+ return allowedRooms;
67
+ };
68
+
69
+ this.bind<TSocketIOValidateRoomFn>({
70
+ key: SocketIOBindingKeys.VALIDATE_ROOM_HANDLER,
71
+ }).toValue(validateRoomFn);
72
+
73
+ // 4. Client connected handler (optional)
74
+ const clientConnectedFn: TSocketIOClientConnectedFn = ({ socket }) => {
75
+ console.log('Client connected:', socket.id);
76
+ // Register custom event handlers on the socket
77
+ };
78
+
79
+ this.bind<TSocketIOClientConnectedFn>({
80
+ key: SocketIOBindingKeys.CLIENT_CONNECTED_HANDLER,
81
+ }).toValue(clientConnectedFn);
82
+
83
+ // 5. Register the component -- that's it!
84
+ this.component(SocketIOComponent);
85
+ }
86
+ }
87
+ ```
88
+
89
+ ### 3. Why `autoConnect: false`
90
+
91
+ - **The helper owns connection, not you.** `RedisSingleHelper` is created with `autoConnect: false` because the server helper internally calls `client.duplicate()` to create 3 independent Redis connections (pub, sub, emitter).
92
+ - **Duplicates inherit `lazyConnect`, not connection state.** During `configure()`, the helper detects clients in `wait` status and explicitly calls `client.connect()` on each, then awaits all 3 to reach `ready` status before proceeding.
93
+ - **This avoids a race.** If the parent connects before the duplicates exist, the duplicates can end up in an inconsistent state relative to the parent's connection lifecycle.
94
+
95
+ ### Redis Connection Alternatives
96
+
97
+ `RedisSingleHelper` (single instance), `RedisClusterHelper` (cluster mode), and `RedisSentinelHelper` (Sentinel HA) all extend `AbstractRedisHelper` and satisfy the `IRedisHelper` interface the component validates against.
98
+
99
+ ```typescript
100
+ import { RedisClusterHelper } from '@venizia/ignis-helpers';
101
+
102
+ // For Redis Cluster deployments
103
+ const redisHelper = new RedisClusterHelper({
104
+ name: 'socket-io-redis-cluster',
105
+ nodes: [
106
+ { host: 'redis-node-1', port: 6379 },
107
+ { host: 'redis-node-2', port: 6380 },
108
+ { host: 'redis-node-3', port: 6381 },
109
+ ],
110
+ password: process.env.REDIS_PASSWORD,
111
+ autoConnect: false,
112
+ });
113
+
114
+ this.bind<RedisClusterHelper>({
115
+ key: SocketIOBindingKeys.REDIS_CONNECTION,
116
+ }).toValue(redisHelper);
117
+ ```
118
+
119
+ The internal `TRedisClient` type is `Redis | Cluster`, so both ioredis connection types are supported transparently.
120
+
121
+ > [!NOTE]
122
+ > Full defaults, the complete binding key table, and every system event/room constant are in the [API Reference](./api#configuration-reference).
4
123
 
5
124
  ## Server-Side Usage
6
125
 
7
126
  ### Inject and Use in Services/Controllers
8
127
 
9
- Inject `SocketIOServerHelper` to interact with Socket.IO:
128
+ - **`SOCKET_IO_INSTANCE` does not exist at construction time.** The component binds `SocketIOServerHelper` from a post-start hook, which runs after the server starts -- well after every service/controller has already been constructed by the DI container.
129
+ - **Use a lazy getter, not `@inject`.** Resolve the helper from the application container on first access, and cache it. `@inject`-ing `SOCKET_IO_INSTANCE` directly in a constructor will resolve to nothing.
10
130
 
11
131
  ```typescript
12
132
  import {
@@ -19,7 +139,6 @@ import { SocketIOBindingKeys } from '@venizia/ignis/socket-io';
19
139
  import { SocketIOServerHelper } from '@venizia/ignis-helpers/socket-io';
20
140
 
21
141
  export class NotificationService extends BaseService {
22
- // Lazy getter pattern -- helper is bound AFTER server starts
23
142
  private _io: SocketIOServerHelper | null = null;
24
143
 
25
144
  constructor(
@@ -78,19 +197,14 @@ export class NotificationService extends BaseService {
78
197
  }
79
198
  ```
80
199
 
81
- > [!IMPORTANT]
82
- > **Lazy getter pattern**: Since `SocketIOServerHelper` is bound via a post-start hook, it's not available during DI construction. Use a lazy getter that resolves from the application container on first access.
83
-
84
200
  ## Client Helper
85
201
 
86
- `SocketIOClientHelper` provides a managed Socket.IO client for connecting to Socket.IO servers -- useful for service-to-service communication, testing, or building relay services. It extends `BaseHelper` for scoped logging and wraps the `socket.io-client` library with authentication flow, lifecycle callbacks, and error-safe event subscription.
202
+ `SocketIOClientHelper` provides a managed Socket.IO client for connecting to Socket.IO servers -- useful for service-to-service communication, testing, or building relay services. It extends `BaseHelper` for scoped logging and wraps `socket.io-client` with authentication flow, lifecycle callbacks, and error-safe event subscription.
87
203
 
88
204
  ### Client Setup
89
205
 
90
206
  ```typescript
91
- import {
92
- SocketIOClientHelper,
93
- } from '@venizia/ignis-helpers/socket-io';
207
+ import { SocketIOClientHelper } from '@venizia/ignis-helpers/socket-io';
94
208
 
95
209
  const client = new SocketIOClientHelper({
96
210
  identifier: 'notification-relay',
@@ -122,13 +236,13 @@ const client = new SocketIOClientHelper({
122
236
  });
123
237
  ```
124
238
 
125
- #### Constructor Behavior
126
-
127
- The constructor immediately calls `configure()`, which creates the `socket.io-client` `Socket` instance via `io(host, options)` and registers all internal event handlers (`connect`, `disconnect`, `connect_error`, `authenticated`, `unauthenticated`, `ping`). The socket is **not** connected until you call `client.connect()` (if using `autoConnect: false` in the options) or it connects automatically if `autoConnect` is not explicitly disabled.
239
+ - **The constructor calls `configure()` immediately.** `configure()` creates the `socket.io-client` `Socket` instance via `io(host, options)` and registers all internal event handlers (`connect`, `disconnect`, `connect_error`, `authenticated`, `unauthenticated`, `ping`).
240
+ - **The socket does not connect on its own accord unless `autoConnect` allows it.** Call `client.connect()` explicitly when `autoConnect: false` is set in `options`; otherwise the socket connects automatically.
128
241
 
129
242
  #### `connect` vs `connection` Event
130
243
 
131
- The client-side `socket.io-client` library fires the `connect` event (no "ion" suffix) when the connection is established. The server-side `socket.io` library fires `connection` (with the suffix). This is a Socket.IO convention, not an IGNIS-specific behavior. The client helper registers on `'connect'` while the server helper registers on `SocketIOConstants.EVENT_CONNECT` which equals `'connection'`.
244
+ - **Client and server use different event names.** `socket.io-client` fires `connect` (no suffix) when the connection is established; server-side `socket.io` fires `connection` (with the suffix). This is a Socket.IO convention, not IGNIS-specific.
245
+ - **The two helpers mirror this.** The client helper registers on `'connect'`; the server helper registers on `SocketIOConstants.EVENT_CONNECT`, which equals `'connection'`.
132
246
 
133
247
  ### Authentication Flow
134
248
 
@@ -139,20 +253,21 @@ After connecting, the client must emit `authenticate` to start the auth handshak
139
253
  client.authenticate();
140
254
  ```
141
255
 
142
- The `authenticate()` method has two guard conditions:
256
+ `authenticate()` has two guard conditions -- both make the call a no-op with a warning log:
257
+
143
258
  1. The socket must be connected (`client.connected === true`)
144
- 2. The current state must be `unauthorized` -- calling `authenticate()` while `authenticating` or already `authenticated` is a no-op with a warning log
259
+ 2. The current state must be `unauthorized` -- calling `authenticate()` while `authenticating` or already `authenticated` does nothing
145
260
 
146
261
  #### Authentication Failure Details
147
262
 
148
- The server sends two distinct error messages depending on how the `authenticateFn` fails:
263
+ The server sends two distinct error messages depending on how `authenticateFn` fails:
149
264
 
150
265
  | Failure Mode | Message | Cause |
151
266
  |-------------|---------|-------|
152
267
  | `authenticateFn` returned `false` | `"Invalid token to authenticate! Please login again!"` | Credentials were checked but deemed invalid |
153
268
  | `authenticateFn` threw an error | `"Failed to authenticate connection! Please login again!"` | An unexpected error occurred during validation |
154
269
 
155
- Both failure paths set the client state back to `unauthorized`, emit the `unauthenticated` event to the client with the message, and then disconnect the socket after the message is delivered (via `setImmediate` callback).
270
+ Both failure paths set the client state back to `unauthorized`, emit the `unauthenticated` event to the client with the message, and disconnect the socket after the message is delivered (via a `setImmediate` callback).
156
271
 
157
272
  ### Event Subscription
158
273
 
@@ -186,7 +301,8 @@ client.subscribeMany({
186
301
 
187
302
  #### Deduplication Behavior
188
303
 
189
- By default (`ignoreDuplicate: true`), `subscribe()` checks `socket.hasListeners(event)` before registering. If listeners already exist for the event, the call is a no-op and logs an info message. Set `ignoreDuplicate: false` to allow multiple handlers for the same event.
304
+ - **The default (`ignoreDuplicate: true`) checks `socket.hasListeners(event)` first.** If listeners already exist for the event, `subscribe()` is a no-op and logs an info message.
305
+ - **Set `ignoreDuplicate: false` to stack handlers.** This allows multiple handlers to run for the same event.
190
306
 
191
307
  ### Unsubscribing
192
308
 
@@ -207,14 +323,14 @@ client.unsubscribeMany({ events: ['chat:message', 'user:joined', 'room:updated']
207
323
  client.emit({
208
324
  topic: 'chat:send',
209
325
  data: { text: 'Hello world' },
210
- doLog: true, // optional: log the emission
211
- cb: () => { // optional: callback via setImmediate after emit
326
+ doLog: true, // optional: log the emission
327
+ callback: () => { // optional: invoked via setImmediate after emit
212
328
  console.log('Message sent');
213
329
  },
214
330
  });
215
331
  ```
216
332
 
217
- The `emit()` method throws if the socket is not connected or if no `topic` is provided. Unlike `send()` on the server helper, this method does **not** silently swallow errors.
333
+ `emit()` throws if the socket is not connected or if no `topic` is provided. Unlike `send()` on the server helper, this method does **not** silently swallow missing-argument errors.
218
334
 
219
335
  ### Room Management
220
336
 
@@ -226,7 +342,7 @@ client.joinRooms({ rooms: ['chat-room-1', 'notifications'] });
226
342
  client.leaveRooms({ rooms: ['chat-room-1'] });
227
343
  ```
228
344
 
229
- Both methods emit Socket.IO events (`join` / `leave`) to the server. The actual join/leave happens server-side. If the socket is not connected, the call is a no-op with a warning log.
345
+ Both methods emit Socket.IO events (`join` / `leave`) to the server -- the actual join/leave happens server-side. If the socket is not connected, the call is a no-op with a warning log.
230
346
 
231
347
  ### Connection Management
232
348
 
@@ -251,7 +367,8 @@ const rawSocket = client.getSocketClient();
251
367
  client.shutdown();
252
368
  ```
253
369
 
254
- The `shutdown()` method:
370
+ `shutdown()` does three things, in order:
371
+
255
372
  1. Calls `removeAllListeners()` on the underlying socket to prevent memory leaks
256
373
  2. Disconnects if still connected
257
374
  3. Resets state to `unauthorized`
@@ -317,6 +434,6 @@ Review the example code to understand production-ready patterns for:
317
434
 
318
435
  ## See Also
319
436
 
320
- - [Setup & Configuration](./) -- Quick reference, installation, bindings, constants
321
- - [API Reference](./api) -- Architecture, method signatures, internals, types
437
+ - [Setup & Configuration](./) -- Quick reference, import paths, use cases
438
+ - [API Reference](./api) -- Architecture, configuration reference, method signatures, internals, types
322
439
  - [Error Reference](./errors) -- Error conditions and troubleshooting