@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.
- package/README.md +14 -14
- package/content/best-practices/api-usage-examples.md +39 -19
- package/content/best-practices/architectural-patterns.md +22 -11
- package/content/best-practices/architecture-decisions.md +29 -16
- package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
- package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
- package/content/best-practices/code-style-standards/control-flow.md +33 -1
- package/content/best-practices/code-style-standards/documentation.md +28 -8
- package/content/best-practices/code-style-standards/function-patterns.md +15 -4
- package/content/best-practices/code-style-standards/index.md +7 -2
- package/content/best-practices/code-style-standards/naming-conventions.md +26 -2
- package/content/best-practices/code-style-standards/route-definitions.md +9 -5
- package/content/best-practices/code-style-standards/tooling.md +14 -1
- package/content/best-practices/code-style-standards/type-safety.md +39 -6
- package/content/best-practices/common-pitfalls.md +59 -35
- package/content/best-practices/contribution-workflow.md +6 -2
- package/content/best-practices/data-modeling.md +78 -62
- package/content/best-practices/deployment-strategies.md +56 -19
- package/content/best-practices/error-handling.md +182 -93
- package/content/best-practices/index.md +6 -0
- package/content/best-practices/performance-optimization.md +26 -13
- package/content/best-practices/security-guidelines.md +35 -9
- package/content/best-practices/testing-strategies.md +7 -2
- package/content/best-practices/troubleshooting-tips.md +27 -17
- package/content/extensions/components/api-reference.md +107 -322
- package/content/extensions/components/authentication/api.md +454 -603
- package/content/extensions/components/authentication/errors.md +121 -498
- package/content/extensions/components/authentication/index.md +88 -801
- package/content/extensions/components/authentication/usage.md +207 -956
- package/content/extensions/components/authorization/api.md +736 -656
- package/content/extensions/components/authorization/errors.md +168 -206
- package/content/extensions/components/authorization/index.md +82 -797
- package/content/extensions/components/authorization/usage.md +194 -527
- package/content/extensions/components/health-check.md +71 -243
- package/content/extensions/components/mail/api.md +504 -287
- package/content/extensions/components/mail/errors.md +73 -61
- package/content/extensions/components/mail/index.md +96 -467
- package/content/extensions/components/mail/usage.md +130 -172
- package/content/extensions/components/request-tracker.md +66 -173
- package/content/extensions/components/socket-io/api.md +195 -13
- package/content/extensions/components/socket-io/errors.md +3 -3
- package/content/extensions/components/socket-io/index.md +50 -337
- package/content/extensions/components/socket-io/usage.md +143 -26
- package/content/extensions/components/static-asset/api.md +410 -142
- package/content/extensions/components/static-asset/errors.md +110 -53
- package/content/extensions/components/static-asset/index.md +79 -608
- package/content/extensions/components/static-asset/usage.md +180 -300
- package/content/extensions/components/websocket/api.md +275 -399
- package/content/extensions/components/websocket/errors.md +47 -56
- package/content/extensions/components/websocket/index.md +74 -407
- package/content/extensions/components/websocket/usage.md +110 -341
- package/content/extensions/helpers/cron/index.md +51 -160
- package/content/extensions/helpers/crypto/index.md +62 -483
- package/content/extensions/helpers/crypto/reference.md +456 -0
- package/content/extensions/helpers/env/index.md +60 -178
- package/content/extensions/helpers/error/index.md +221 -207
- package/content/extensions/helpers/inversion/index.md +65 -556
- package/content/extensions/helpers/inversion/reference.md +522 -0
- package/content/extensions/helpers/kafka/admin.md +20 -1
- package/content/extensions/helpers/kafka/compile-binary.md +41 -35
- package/content/extensions/helpers/kafka/consumer.md +54 -20
- package/content/extensions/helpers/kafka/examples.md +21 -16
- package/content/extensions/helpers/kafka/index.md +80 -610
- package/content/extensions/helpers/kafka/producer.md +134 -5
- package/content/extensions/helpers/kafka/schema-registry.md +45 -70
- package/content/extensions/helpers/logger/hf-logger.md +193 -0
- package/content/extensions/helpers/logger/index.md +64 -563
- package/content/extensions/helpers/logger/pino.md +85 -0
- package/content/extensions/helpers/logger/reference.md +746 -0
- package/content/extensions/helpers/network/api.md +241 -195
- package/content/extensions/helpers/network/index.md +72 -530
- package/content/extensions/helpers/queue/index.md +72 -900
- package/content/extensions/helpers/queue/reference.md +467 -0
- package/content/extensions/helpers/redis/index.md +73 -645
- package/content/extensions/helpers/redis/reference.md +727 -0
- package/content/extensions/helpers/secrets/index.md +66 -0
- package/content/extensions/helpers/socket-io/api.md +305 -203
- package/content/extensions/helpers/socket-io/index.md +66 -432
- package/content/extensions/helpers/storage/api.md +564 -462
- package/content/extensions/helpers/storage/index.md +77 -573
- package/content/extensions/helpers/types/index.md +66 -499
- package/content/extensions/helpers/types/reference.md +650 -0
- package/content/extensions/helpers/uid/index.md +58 -227
- package/content/extensions/helpers/websocket/api.md +329 -216
- package/content/extensions/helpers/websocket/index.md +65 -503
- package/content/extensions/helpers/worker-thread/index.md +58 -396
- package/content/extensions/helpers/worker-thread/reference.md +428 -0
- package/content/guides/core-concepts/persistent/models.md +1 -1
- package/content/guides/core-concepts/persistent/search-typesense.md +3 -3
- package/content/guides/core-concepts/persistent/transactions.md +1 -1
- package/content/guides/core-concepts/secrets-vault.md +177 -0
- package/content/guides/core-concepts/services.md +1 -1
- package/content/guides/migrations/redis-helpers-migration.md +1 -1
- package/content/guides/migrations/unified-connectors-migration.md +2 -2
- package/content/guides/tutorials/ecommerce-api.md +3 -8
- package/content/references/base/application.md +1 -1
- package/content/references/base/connectors.md +79 -136
- package/content/references/base/datasources-reference.md +599 -0
- package/content/references/base/datasources.md +84 -444
- package/content/references/base/dependency-injection.md +17 -39
- package/content/references/base/filter-system/application-usage.md +69 -121
- package/content/references/base/filter-system/array-operators.md +12 -0
- package/content/references/base/filter-system/comparison-operators.md +12 -0
- package/content/references/base/filter-system/default-filter.md +136 -348
- package/content/references/base/filter-system/fields-order-pagination.md +38 -16
- package/content/references/base/filter-system/index.md +106 -257
- package/content/references/base/filter-system/json-filtering.md +12 -2
- package/content/references/base/filter-system/list-operators.md +16 -2
- package/content/references/base/filter-system/logical-operators.md +13 -0
- package/content/references/base/filter-system/null-operators.md +13 -0
- package/content/references/base/filter-system/pattern-matching.md +12 -0
- package/content/references/base/filter-system/quick-reference.md +11 -2
- package/content/references/base/filter-system/range-operators.md +12 -0
- package/content/references/base/filter-system/tips.md +70 -133
- package/content/references/base/filter-system/use-cases.md +156 -233
- package/content/references/base/middlewares.md +35 -21
- package/content/references/base/models-reference.md +886 -0
- package/content/references/base/models.md +80 -1452
- package/content/references/base/repositories/advanced.md +156 -192
- package/content/references/base/repositories/index.md +77 -650
- package/content/references/base/repositories/mixins.md +22 -18
- package/content/references/base/repositories/relations.md +123 -171
- package/content/references/base/repositories/soft-deletable.md +58 -56
- package/content/references/base/secrets.md +263 -0
- package/content/references/base/services.md +2 -2
- package/content/references/configuration/environment-variables.md +48 -4
- package/content/references/configuration/index.md +49 -31
- package/content/references/quick-reference.md +3 -16
- package/content/references/utilities/crypto.md +35 -76
- package/content/references/utilities/date.md +33 -73
- package/content/references/utilities/index.md +1 -1
- package/content/references/utilities/jsx-reference.md +298 -0
- package/content/references/utilities/jsx.md +82 -525
- package/content/references/utilities/module.md +29 -62
- package/content/references/utilities/parse.md +34 -64
- package/content/references/utilities/performance.md +33 -58
- package/content/references/utilities/promise.md +28 -62
- package/content/references/utilities/request.md +57 -218
- package/content/references/utilities/schema.md +43 -137
- package/content/references/utilities/statuses-reference.md +361 -0
- package/content/references/utilities/statuses.md +63 -667
- package/package.json +8 -8
|
@@ -1,12 +1,132 @@
|
|
|
1
1
|
# Socket.IO -- Usage & Examples
|
|
2
2
|
|
|
3
|
-
>
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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`
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
211
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|