@jr200-labs/xstate-nats 0.9.10 → 0.9.11

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 CHANGED
@@ -233,6 +233,7 @@ and request/reply replier.
233
233
  | `xstate.nats.publish` | `SUBJECT.PUBLISH` | `subject`, `payload.bytes` |
234
234
  | `xstate.nats.request` | `SUBJECT.REQUEST` | `subject`, `payload.bytes`, `timeout.ms` |
235
235
  | `xstate.nats.reconnect` | NATS status loop | `reconnect.type` |
236
+ | `xstate.nats.lifecycle` | root machine | `xstate.state`, `xstate.event` |
236
237
  | `xstate.nats.kv.watch` | `KV.SUBSCRIBE` | `bucket`, `key` |
237
238
  | `xstate.nats.kv.entry` | per KV watch entry | `bucket`, `key`, `operation` |
238
239
 
@@ -240,6 +241,29 @@ All error paths record exceptions on the active span, set span status to
240
241
  `ERROR`, and emit a named event (`xstate.nats.error` / `xstate.nats.kv.error`)
241
242
  with a truncated stack.
242
243
 
244
+ ### Lifecycle diagnostics
245
+
246
+ Root machine lifecycle diagnostics are opt-in and separate from raw NATS
247
+ protocol frame logging. Enable them on the connection config:
248
+
249
+ ```ts
250
+ send({
251
+ type: 'CONFIGURE',
252
+ config: {
253
+ opts: { servers: ['wss://example-nats'] },
254
+ diagnostics: { lifecycle: true },
255
+ maxRetries: 3,
256
+ },
257
+ })
258
+ ```
259
+
260
+ When enabled, the root machine emits sanitized `xstate.nats.lifecycle` spans and
261
+ `console.debug('xstate-nats lifecycle', attributes)` breadcrumbs for configure,
262
+ connect, close, manager initialization, and NATS status events. Diagnostics
263
+ include state, event type, server URLs, debug/verbose flags, retry count, auth
264
+ type, and manager readiness flags. They do not include credentials, JWTs, nkeys,
265
+ signatures, passwords, tokens, or raw protocol frames.
266
+
243
267
  ### Enabling tracing
244
268
 
245
269
  `@opentelemetry/api` is a peer dependency — the consumer controls the installed
@@ -2,10 +2,14 @@ import { ConnectionOptions, NatsConnection } from '@nats-io/nats-core';
2
2
  import { ExternalEvents as KvExternalEvents } from './kv';
3
3
  import { ExternalEvents as SubjectExternalEvents } from './subject';
4
4
  import { type AuthConfig } from '../actions/types';
5
+ export interface NatsDiagnosticsConfig {
6
+ lifecycle?: boolean;
7
+ }
5
8
  export interface NatsConnectionConfig {
6
9
  opts: ConnectionOptions;
7
10
  auth?: AuthConfig;
8
11
  maxRetries: number;
12
+ diagnostics?: NatsDiagnosticsConfig;
9
13
  }
10
14
  export interface Context {
11
15
  connection: NatsConnection | null;
@@ -518,7 +522,7 @@ export declare const natsMachine: import("xstate").StateMachine<Context, {
518
522
  } | {
519
523
  type: "shouldConfigureAfterClose";
520
524
  params: unknown;
521
- }, never, "error" | "not_configured" | "configured" | "connecting" | "initialise_managers" | "connected" | "closing" | "closed", string, import("xstate").NonReducibleUnknown, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, {
525
+ }, never, "error" | "not_configured" | "configured" | "connecting" | "initialise_managers" | "closing" | "connected" | "closed", string, import("xstate").NonReducibleUnknown, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, {
522
526
  states: {
523
527
  readonly not_configured: {};
524
528
  readonly configured: {};
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/machines/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,EAAkB,cAAc,IAAI,gBAAgB,EAAE,MAAM,MAAM,CAAA;AACzE,OAAO,EAAuB,cAAc,IAAI,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAExF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,iBAAiB,CAAA;IACvB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IACjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,UAAU,CAAC,EAAE,oBAAoB,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,EAAE,OAAO,CAAA;IAC5B,cAAc,EAAE,OAAO,CAAA;IACvB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAYD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB,qBAAqB,GACrB,gBAAgB,CAAA;AAIpB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAlBZ,WAAW;gBAAc,cAAc;;UACvC,cAAc;;UACd,MAAM;WAAS,KAAK;;UACpB,WAAW;;UACX,OAAO;;UAKP,WAAW;YAAU,oBAAoB;;UACzC,SAAS;;UACT,YAAY;;UACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2VjB,CAAA"}
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/machines/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,EAAkB,cAAc,IAAI,gBAAgB,EAAE,MAAM,MAAM,CAAA;AACzE,OAAO,EAAuB,cAAc,IAAI,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAExF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,iBAAiB,CAAA;IACvB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,qBAAqB,CAAA;CACpC;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IACjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,UAAU,CAAC,EAAE,oBAAoB,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,EAAE,OAAO,CAAA;IAC5B,cAAc,EAAE,OAAO,CAAA;IACvB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAYD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB,qBAAqB,GACrB,gBAAgB,CAAA;AAkDpB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAhEZ,WAAW;gBAAc,cAAc;;UACvC,cAAc;;UACd,MAAM;WAAS,KAAK;;UACpB,WAAW;;UACX,OAAO;;UAKP,WAAW;YAAU,oBAAoB;;UACzC,SAAS;;UACT,YAAY;;UACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6bjB,CAAA"}
@@ -2,6 +2,44 @@ import { assign, sendTo, setup } from 'xstate';
2
2
  import { kvManagerLogic } from './kv';
3
3
  import { subjectManagerLogic } from './subject';
4
4
  import { connectToNats, disconnectNats } from '../actions/connection';
5
+ import { withSpan } from '../telemetry';
6
+ function lifecycleDiagnosticsEnabled(context) {
7
+ return Boolean(context.natsConfig?.diagnostics?.lifecycle);
8
+ }
9
+ function serverUrls(config) {
10
+ const servers = config?.opts.servers;
11
+ return Array.isArray(servers) ? servers.join(',') : servers;
12
+ }
13
+ function lifecycleAttributes(context, event, state) {
14
+ return {
15
+ 'xstate.state': state,
16
+ 'xstate.event': event.type,
17
+ 'nats.server.urls': serverUrls(context.natsConfig),
18
+ 'nats.debug': Boolean(context.natsConfig?.opts.debug),
19
+ 'nats.verbose': Boolean(context.natsConfig?.opts.verbose),
20
+ 'nats.max_retries': context.natsConfig?.maxRetries,
21
+ 'nats.auth.type': context.natsConfig?.auth?.type,
22
+ 'nats.has_connection': context.connection !== null,
23
+ 'nats.subject_manager_ready': context.subjectManagerReady,
24
+ 'nats.kv_manager_ready': context.kvManagerReady,
25
+ 'nats.configure_after_close': context.configureAfterClose,
26
+ 'nats.connect_after_close': context.connectAfterClose,
27
+ };
28
+ }
29
+ function recordLifecycle(context, event, state) {
30
+ if (!lifecycleDiagnosticsEnabled(context))
31
+ return;
32
+ const attributes = lifecycleAttributes(context, event, state);
33
+ console.debug('xstate-nats lifecycle', attributes);
34
+ withSpan('xstate.nats.lifecycle', 'xstate.nats.error', attributes, (span) => {
35
+ span.addEvent(`xstate.nats.${state}.${event.type}`, attributes);
36
+ });
37
+ }
38
+ function lifecycleAction(state) {
39
+ return ({ context, event }) => {
40
+ recordLifecycle(context, event, state);
41
+ };
42
+ }
5
43
  export const natsMachine = setup({
6
44
  types: {
7
45
  context: {},
@@ -95,6 +133,7 @@ export const natsMachine = setup({
95
133
  'NATS_CONNECTION.*': {
96
134
  actions: [
97
135
  ({ context, event }) => {
136
+ recordLifecycle(context, event, 'status');
98
137
  if (context.natsConfig?.opts.debug) {
99
138
  console.log('root received NATS status event', event);
100
139
  }
@@ -122,10 +161,11 @@ export const natsMachine = setup({
122
161
  entry: ['clearDeferredCloseActions'],
123
162
  on: {
124
163
  CONFIGURE: {
125
- actions: ['configureNats'],
164
+ actions: ['configureNats', lifecycleAction('configured')],
126
165
  },
127
166
  CONNECT: {
128
167
  target: 'connecting',
168
+ actions: lifecycleAction('configured'),
129
169
  },
130
170
  RESET: {
131
171
  target: 'not_configured',
@@ -141,7 +181,17 @@ export const natsMachine = setup({
141
181
  },
142
182
  },
143
183
  connecting: {
144
- entry: ['clearDeferredCloseActions'],
184
+ entry: ['clearDeferredCloseActions', lifecycleAction('connecting')],
185
+ on: {
186
+ CONFIGURE: {
187
+ target: 'connecting',
188
+ reenter: true,
189
+ actions: ['configureNats', lifecycleAction('connecting')],
190
+ },
191
+ CONNECT: {
192
+ actions: lifecycleAction('connecting'),
193
+ },
194
+ },
145
195
  invoke: [
146
196
  {
147
197
  src: 'connectToNats',
@@ -152,6 +202,7 @@ export const natsMachine = setup({
152
202
  onDone: {
153
203
  target: 'initialise_managers',
154
204
  actions: [
205
+ lifecycleAction('connecting'),
155
206
  assign({
156
207
  connection: ({ event }) => event.output,
157
208
  retries: (_) => 0,
@@ -160,16 +211,20 @@ export const natsMachine = setup({
160
211
  },
161
212
  onError: {
162
213
  target: 'error',
163
- actions: assign({
164
- error: ({ event }) => event.error,
165
- retries: ({ context }) => context.retries + 1,
166
- }),
214
+ actions: [
215
+ lifecycleAction('connecting'),
216
+ assign({
217
+ error: ({ event }) => event.error,
218
+ retries: ({ context }) => context.retries + 1,
219
+ }),
220
+ ],
167
221
  },
168
222
  },
169
223
  ],
170
224
  },
171
225
  initialise_managers: {
172
226
  entry: [
227
+ lifecycleAction('initialise_managers'),
173
228
  sendTo('subject', ({ context }) => ({
174
229
  type: 'SUBJECT.CONNECT',
175
230
  connection: context.connection,
@@ -177,11 +232,36 @@ export const natsMachine = setup({
177
232
  sendTo('kv', ({ context }) => ({ type: 'KV.CONNECT', connection: context.connection })),
178
233
  ],
179
234
  on: {
235
+ CONFIGURE: {
236
+ target: 'closing',
237
+ actions: [
238
+ 'configureNatsAfterClose',
239
+ 'reconnectAfterClose',
240
+ lifecycleAction('initialise_managers'),
241
+ ],
242
+ },
243
+ CONNECT: {
244
+ actions: lifecycleAction('initialise_managers'),
245
+ },
246
+ DISCONNECT: {
247
+ target: 'closing',
248
+ actions: ['clearDeferredCloseActions', lifecycleAction('initialise_managers')],
249
+ },
250
+ CLOSE: {
251
+ target: 'closing',
252
+ actions: ['clearDeferredCloseActions', lifecycleAction('initialise_managers')],
253
+ },
180
254
  'SUBJECT.CONNECTED': {
181
- actions: [assign({ subjectManagerReady: (_) => true })],
255
+ actions: [
256
+ assign({ subjectManagerReady: (_) => true }),
257
+ lifecycleAction('initialise_managers'),
258
+ ],
182
259
  },
183
260
  'KV.CONNECTED': {
184
- actions: [assign({ kvManagerReady: (_) => true })],
261
+ actions: [
262
+ assign({ kvManagerReady: (_) => true }),
263
+ lifecycleAction('initialise_managers'),
264
+ ],
185
265
  },
186
266
  },
187
267
  always: [
@@ -194,6 +274,7 @@ export const natsMachine = setup({
194
274
  connected: {
195
275
  entry: [
196
276
  'clearDeferredCloseActions',
277
+ lifecycleAction('connected'),
197
278
  (event) => {
198
279
  if (event.context.natsConfig?.opts.debug) {
199
280
  console.log('CONNECTED', event.context.connection?.getServer());
@@ -203,15 +284,15 @@ export const natsMachine = setup({
203
284
  on: {
204
285
  CONFIGURE: {
205
286
  target: 'closing',
206
- actions: ['configureNatsAfterClose', 'reconnectAfterClose'],
287
+ actions: ['configureNatsAfterClose', 'reconnectAfterClose', lifecycleAction('connected')],
207
288
  },
208
289
  DISCONNECT: {
209
290
  target: 'closing',
210
- actions: ['clearDeferredCloseActions'],
291
+ actions: ['clearDeferredCloseActions', lifecycleAction('connected')],
211
292
  },
212
293
  CLOSE: {
213
294
  target: 'closing',
214
- actions: ['clearDeferredCloseActions'],
295
+ actions: ['clearDeferredCloseActions', lifecycleAction('connected')],
215
296
  },
216
297
  'SUBJECT.*': {
217
298
  actions: [
@@ -253,6 +334,7 @@ export const natsMachine = setup({
253
334
  console.log('CLOSING', event.context.connection?.getServer());
254
335
  }
255
336
  },
337
+ lifecycleAction('closing'),
256
338
  sendTo('subject', { type: 'SUBJECT.DISCONNECTED' }),
257
339
  sendTo('kv', { type: 'KV.DISCONNECTED' }),
258
340
  ],
@@ -263,33 +345,40 @@ export const natsMachine = setup({
263
345
  {
264
346
  guard: 'shouldConnectAfterClose',
265
347
  target: 'connecting',
348
+ actions: lifecycleAction('closing'),
266
349
  },
267
350
  {
268
351
  guard: 'shouldConfigureAfterClose',
269
352
  target: 'configured',
353
+ actions: lifecycleAction('closing'),
270
354
  },
271
355
  {
272
356
  target: 'closed',
357
+ actions: lifecycleAction('closing'),
273
358
  },
274
359
  ],
275
360
  onError: {
276
361
  target: 'error',
277
- actions: assign({
278
- error: ({ event }) => event.error,
279
- }),
362
+ actions: [
363
+ lifecycleAction('closing'),
364
+ assign({
365
+ error: ({ event }) => event.error,
366
+ }),
367
+ ],
280
368
  },
281
369
  },
282
370
  on: {
283
371
  CONFIGURE: {
284
- actions: ['configureNatsAfterClose'],
372
+ actions: ['configureNatsAfterClose', lifecycleAction('closing')],
285
373
  },
286
374
  CONNECT: {
287
- actions: ['reconnectAfterClose'],
375
+ actions: ['reconnectAfterClose', lifecycleAction('closing')],
288
376
  },
289
377
  },
290
378
  },
291
379
  closed: {
292
380
  entry: [
381
+ lifecycleAction('closed'),
293
382
  assign({
294
383
  connection: (_) => null,
295
384
  subjectManagerReady: (_) => false,
@@ -301,7 +390,7 @@ export const natsMachine = setup({
301
390
  on: {
302
391
  CONFIGURE: {
303
392
  target: 'configured',
304
- actions: ['configureNats'],
393
+ actions: ['configureNats', lifecycleAction('closed')],
305
394
  },
306
395
  RESET: {
307
396
  target: 'not_configured',
@@ -309,6 +398,7 @@ export const natsMachine = setup({
309
398
  },
310
399
  CONNECT: {
311
400
  target: 'connecting',
401
+ actions: lifecycleAction('closed'),
312
402
  },
313
403
  },
314
404
  '*': {
@@ -320,11 +410,11 @@ export const natsMachine = setup({
320
410
  },
321
411
  },
322
412
  error: {
323
- entry: ['clearDeferredCloseActions'],
413
+ entry: ['clearDeferredCloseActions', lifecycleAction('error')],
324
414
  on: {
325
415
  CONFIGURE: {
326
416
  target: 'configured',
327
- actions: ['configureNats'],
417
+ actions: ['configureNats', lifecycleAction('error')],
328
418
  },
329
419
  RESET: {
330
420
  target: 'not_configured',
@@ -1 +1 @@
1
- {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/machines/root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/machines/root.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jr200-labs/xstate-nats",
3
- "version": "0.9.10",
3
+ "version": "0.9.11",
4
4
  "description": "XState machine for NATS",
5
5
  "license": "MIT",
6
6
  "author": "Jayshan Raghunandan",
@@ -53,6 +53,40 @@ const mockKvMachine = createMachine({
53
53
  },
54
54
  })
55
55
 
56
+ const slowSubjectMachine = createMachine({
57
+ initial: 'idle',
58
+ states: {
59
+ idle: {
60
+ on: {
61
+ 'SUBJECT.CONNECT': { target: 'connected' },
62
+ 'SUBJECT.DISCONNECTED': { target: 'idle' },
63
+ },
64
+ },
65
+ connected: {
66
+ on: {
67
+ 'SUBJECT.DISCONNECTED': { target: 'idle' },
68
+ },
69
+ },
70
+ },
71
+ })
72
+
73
+ const slowKvMachine = createMachine({
74
+ initial: 'idle',
75
+ states: {
76
+ idle: {
77
+ on: {
78
+ 'KV.CONNECT': { target: 'connected' },
79
+ 'KV.DISCONNECTED': { target: 'idle' },
80
+ },
81
+ },
82
+ connected: {
83
+ on: {
84
+ 'KV.DISCONNECTED': { target: 'idle' },
85
+ },
86
+ },
87
+ },
88
+ })
89
+
56
90
  const mockConnection = {
57
91
  drain: vi.fn().mockResolvedValue(undefined),
58
92
  close: vi.fn().mockResolvedValue(undefined),
@@ -445,6 +479,142 @@ describe('natsMachine', () => {
445
479
  actor.stop()
446
480
  })
447
481
 
482
+ it('should emit sanitized lifecycle diagnostics when enabled', async () => {
483
+ const debugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {})
484
+ const actor = createActor(createTestMachine())
485
+ actor.start()
486
+
487
+ actor.send({
488
+ type: 'CONFIGURE',
489
+ config: {
490
+ opts: { debug: false, servers: ['ws://localhost:4222'], verbose: false },
491
+ auth: { type: 'token', token: 'secret-token' },
492
+ diagnostics: { lifecycle: true },
493
+ maxRetries: 3,
494
+ },
495
+ })
496
+ actor.send({ type: 'CONNECT' })
497
+
498
+ await vi.waitFor(() => {
499
+ expect(actor.getSnapshot().value).toBe('connected')
500
+ })
501
+
502
+ expect(debugSpy).toHaveBeenCalled()
503
+ const lifecycleCalls = debugSpy.mock.calls.filter(
504
+ ([message]) => message === 'xstate-nats lifecycle',
505
+ )
506
+ expect(lifecycleCalls.length).toBeGreaterThan(0)
507
+ expect(lifecycleCalls[0][1]).toMatchObject({
508
+ 'nats.auth.type': 'token',
509
+ 'nats.debug': false,
510
+ 'nats.verbose': false,
511
+ 'nats.max_retries': 3,
512
+ 'nats.server.urls': 'ws://localhost:4222',
513
+ })
514
+ expect(JSON.stringify(lifecycleCalls)).not.toContain('secret-token')
515
+ actor.stop()
516
+ debugSpy.mockRestore()
517
+ })
518
+
519
+ it('should restart an in-flight connection when reconfigured while connecting', async () => {
520
+ const firstConnection = createDeferred<any>()
521
+ const secondConnection = createDeferred<any>()
522
+ const connectInputs: any[] = []
523
+ const machine = natsMachine.provide({
524
+ actors: {
525
+ connectToNats: fromPromise(async ({ input }) => {
526
+ connectInputs.push(input)
527
+ return connectInputs.length === 1 ? firstConnection.promise : secondConnection.promise
528
+ }),
529
+ disconnectNats: fromPromise(async () => {}),
530
+ subject: mockSubjectMachine,
531
+ kv: mockKvMachine,
532
+ },
533
+ })
534
+ const actor = createActor(machine)
535
+ actor.start()
536
+
537
+ actor.send({
538
+ type: 'CONFIGURE',
539
+ config: { opts: { debug: false, servers: ['ws://localhost:4222'] }, maxRetries: 3 },
540
+ })
541
+ actor.send({ type: 'CONNECT' })
542
+ await vi.waitFor(() => {
543
+ expect(actor.getSnapshot().value).toBe('connecting')
544
+ })
545
+
546
+ actor.send({
547
+ type: 'CONFIGURE',
548
+ config: { opts: { debug: true, servers: ['ws://localhost:4227'] }, maxRetries: 2 },
549
+ })
550
+ actor.send({ type: 'CONNECT' })
551
+ await vi.waitFor(() => {
552
+ expect(connectInputs).toHaveLength(2)
553
+ })
554
+
555
+ firstConnection.resolve(mockConnection)
556
+ await new Promise((resolve) => setTimeout(resolve, 0))
557
+ expect(actor.getSnapshot().value).toBe('connecting')
558
+
559
+ secondConnection.resolve(mockConnection)
560
+ await vi.waitFor(() => {
561
+ expect(actor.getSnapshot().value).toBe('connected')
562
+ })
563
+ expect(connectInputs[1].opts).toEqual({ debug: true, servers: ['ws://localhost:4227'] })
564
+ expect(actor.getSnapshot().context.natsConfig).toEqual({
565
+ opts: { debug: true, servers: ['ws://localhost:4227'] },
566
+ maxRetries: 2,
567
+ })
568
+ actor.stop()
569
+ })
570
+
571
+ it('should reconnect with the latest config when reconfigured while managers initialise', async () => {
572
+ const connectInputs: any[] = []
573
+ const disconnects: any[] = []
574
+ const machine = natsMachine.provide({
575
+ actors: {
576
+ connectToNats: fromPromise(async ({ input }) => {
577
+ connectInputs.push(input)
578
+ return mockConnection
579
+ }),
580
+ disconnectNats: fromPromise(async ({ input }: { input: any }) => {
581
+ disconnects.push(input.connection)
582
+ }),
583
+ subject: slowSubjectMachine,
584
+ kv: slowKvMachine,
585
+ },
586
+ })
587
+ const actor = createActor(machine)
588
+ actor.start()
589
+
590
+ actor.send({
591
+ type: 'CONFIGURE',
592
+ config: { opts: { debug: false, servers: ['ws://localhost:4222'] }, maxRetries: 3 },
593
+ })
594
+ actor.send({ type: 'CONNECT' })
595
+ await vi.waitFor(() => {
596
+ expect(actor.getSnapshot().value).toBe('initialise_managers')
597
+ })
598
+
599
+ actor.send({
600
+ type: 'CONFIGURE',
601
+ config: { opts: { debug: true, servers: ['ws://localhost:4228'] }, maxRetries: 2 },
602
+ })
603
+ actor.send({ type: 'CONNECT' })
604
+
605
+ await vi.waitFor(() => {
606
+ expect(connectInputs).toHaveLength(2)
607
+ })
608
+ expect(disconnects).toEqual([mockConnection])
609
+ expect(actor.getSnapshot().value).toBe('initialise_managers')
610
+ expect(connectInputs[1].opts).toEqual({ debug: true, servers: ['ws://localhost:4228'] })
611
+ expect(actor.getSnapshot().context.natsConfig).toEqual({
612
+ opts: { debug: true, servers: ['ws://localhost:4228'] },
613
+ maxRetries: 2,
614
+ })
615
+ actor.stop()
616
+ })
617
+
448
618
  it('should forward SUBJECT.* events when connected', async () => {
449
619
  const actor = createActor(createTestMachine())
450
620
  actor.start()
@@ -5,11 +5,17 @@ import { subjectManagerLogic, ExternalEvents as SubjectExternalEvents } from './
5
5
  import { connectToNats, disconnectNats } from '../actions/connection'
6
6
  import { type AuthConfig } from '../actions/types'
7
7
  import { InternalStatusEvents as NatsStatusEvents } from '../actions/connection'
8
+ import { withSpan } from '../telemetry'
9
+
10
+ export interface NatsDiagnosticsConfig {
11
+ lifecycle?: boolean
12
+ }
8
13
 
9
14
  export interface NatsConnectionConfig {
10
15
  opts: ConnectionOptions
11
16
  auth?: AuthConfig
12
17
  maxRetries: number
18
+ diagnostics?: NatsDiagnosticsConfig
13
19
  }
14
20
 
15
21
  export interface Context {
@@ -43,6 +49,52 @@ export type ExternalEvents =
43
49
 
44
50
  type Events = InternalEvents | ExternalEvents
45
51
 
52
+ function lifecycleDiagnosticsEnabled(context: Context): boolean {
53
+ return Boolean(context.natsConfig?.diagnostics?.lifecycle)
54
+ }
55
+
56
+ function serverUrls(config: NatsConnectionConfig | undefined): string | undefined {
57
+ const servers = config?.opts.servers
58
+ return Array.isArray(servers) ? servers.join(',') : servers
59
+ }
60
+
61
+ function lifecycleAttributes(
62
+ context: Context,
63
+ event: { type: string },
64
+ state: string,
65
+ ): Record<string, string | number | boolean | undefined> {
66
+ return {
67
+ 'xstate.state': state,
68
+ 'xstate.event': event.type,
69
+ 'nats.server.urls': serverUrls(context.natsConfig),
70
+ 'nats.debug': Boolean(context.natsConfig?.opts.debug),
71
+ 'nats.verbose': Boolean(context.natsConfig?.opts.verbose),
72
+ 'nats.max_retries': context.natsConfig?.maxRetries,
73
+ 'nats.auth.type': context.natsConfig?.auth?.type,
74
+ 'nats.has_connection': context.connection !== null,
75
+ 'nats.subject_manager_ready': context.subjectManagerReady,
76
+ 'nats.kv_manager_ready': context.kvManagerReady,
77
+ 'nats.configure_after_close': context.configureAfterClose,
78
+ 'nats.connect_after_close': context.connectAfterClose,
79
+ }
80
+ }
81
+
82
+ function recordLifecycle(context: Context, event: { type: string }, state: string): void {
83
+ if (!lifecycleDiagnosticsEnabled(context)) return
84
+
85
+ const attributes = lifecycleAttributes(context, event, state)
86
+ console.debug('xstate-nats lifecycle', attributes)
87
+ withSpan('xstate.nats.lifecycle', 'xstate.nats.error', attributes, (span) => {
88
+ span.addEvent(`xstate.nats.${state}.${event.type}`, attributes)
89
+ })
90
+ }
91
+
92
+ function lifecycleAction(state: string) {
93
+ return ({ context, event }: { context: Context; event: { type: string } }) => {
94
+ recordLifecycle(context, event, state)
95
+ }
96
+ }
97
+
46
98
  export const natsMachine = setup({
47
99
  types: {
48
100
  context: {} as Context,
@@ -136,6 +188,7 @@ export const natsMachine = setup({
136
188
  'NATS_CONNECTION.*': {
137
189
  actions: [
138
190
  ({ context, event }: { context: Context; event: any }) => {
191
+ recordLifecycle(context, event, 'status')
139
192
  if (context.natsConfig?.opts.debug) {
140
193
  console.log('root received NATS status event', event)
141
194
  }
@@ -163,10 +216,11 @@ export const natsMachine = setup({
163
216
  entry: ['clearDeferredCloseActions'],
164
217
  on: {
165
218
  CONFIGURE: {
166
- actions: ['configureNats'],
219
+ actions: ['configureNats', lifecycleAction('configured')],
167
220
  },
168
221
  CONNECT: {
169
222
  target: 'connecting',
223
+ actions: lifecycleAction('configured'),
170
224
  },
171
225
  RESET: {
172
226
  target: 'not_configured',
@@ -182,7 +236,17 @@ export const natsMachine = setup({
182
236
  },
183
237
  },
184
238
  connecting: {
185
- entry: ['clearDeferredCloseActions'],
239
+ entry: ['clearDeferredCloseActions', lifecycleAction('connecting')],
240
+ on: {
241
+ CONFIGURE: {
242
+ target: 'connecting',
243
+ reenter: true,
244
+ actions: ['configureNats', lifecycleAction('connecting')],
245
+ },
246
+ CONNECT: {
247
+ actions: lifecycleAction('connecting'),
248
+ },
249
+ },
186
250
  invoke: [
187
251
  {
188
252
  src: 'connectToNats',
@@ -193,6 +257,7 @@ export const natsMachine = setup({
193
257
  onDone: {
194
258
  target: 'initialise_managers',
195
259
  actions: [
260
+ lifecycleAction('connecting'),
196
261
  assign({
197
262
  connection: ({ event }) => event.output,
198
263
  retries: (_) => 0,
@@ -201,16 +266,20 @@ export const natsMachine = setup({
201
266
  },
202
267
  onError: {
203
268
  target: 'error',
204
- actions: assign({
205
- error: ({ event }) => event.error as Error,
206
- retries: ({ context }) => context.retries + 1,
207
- }),
269
+ actions: [
270
+ lifecycleAction('connecting'),
271
+ assign({
272
+ error: ({ event }) => event.error as Error,
273
+ retries: ({ context }) => context.retries + 1,
274
+ }),
275
+ ],
208
276
  },
209
277
  },
210
278
  ],
211
279
  },
212
280
  initialise_managers: {
213
281
  entry: [
282
+ lifecycleAction('initialise_managers'),
214
283
  sendTo('subject', ({ context }) => ({
215
284
  type: 'SUBJECT.CONNECT',
216
285
  connection: context.connection!,
@@ -218,11 +287,36 @@ export const natsMachine = setup({
218
287
  sendTo('kv', ({ context }) => ({ type: 'KV.CONNECT', connection: context.connection! })),
219
288
  ],
220
289
  on: {
290
+ CONFIGURE: {
291
+ target: 'closing',
292
+ actions: [
293
+ 'configureNatsAfterClose',
294
+ 'reconnectAfterClose',
295
+ lifecycleAction('initialise_managers'),
296
+ ],
297
+ },
298
+ CONNECT: {
299
+ actions: lifecycleAction('initialise_managers'),
300
+ },
301
+ DISCONNECT: {
302
+ target: 'closing',
303
+ actions: ['clearDeferredCloseActions', lifecycleAction('initialise_managers')],
304
+ },
305
+ CLOSE: {
306
+ target: 'closing',
307
+ actions: ['clearDeferredCloseActions', lifecycleAction('initialise_managers')],
308
+ },
221
309
  'SUBJECT.CONNECTED': {
222
- actions: [assign({ subjectManagerReady: (_) => true })],
310
+ actions: [
311
+ assign({ subjectManagerReady: (_) => true }),
312
+ lifecycleAction('initialise_managers'),
313
+ ],
223
314
  },
224
315
  'KV.CONNECTED': {
225
- actions: [assign({ kvManagerReady: (_) => true })],
316
+ actions: [
317
+ assign({ kvManagerReady: (_) => true }),
318
+ lifecycleAction('initialise_managers'),
319
+ ],
226
320
  },
227
321
  },
228
322
  always: [
@@ -235,6 +329,7 @@ export const natsMachine = setup({
235
329
  connected: {
236
330
  entry: [
237
331
  'clearDeferredCloseActions',
332
+ lifecycleAction('connected'),
238
333
  (event) => {
239
334
  if (event.context.natsConfig?.opts.debug) {
240
335
  console.log('CONNECTED', event.context.connection?.getServer())
@@ -244,15 +339,15 @@ export const natsMachine = setup({
244
339
  on: {
245
340
  CONFIGURE: {
246
341
  target: 'closing',
247
- actions: ['configureNatsAfterClose', 'reconnectAfterClose'],
342
+ actions: ['configureNatsAfterClose', 'reconnectAfterClose', lifecycleAction('connected')],
248
343
  },
249
344
  DISCONNECT: {
250
345
  target: 'closing',
251
- actions: ['clearDeferredCloseActions'],
346
+ actions: ['clearDeferredCloseActions', lifecycleAction('connected')],
252
347
  },
253
348
  CLOSE: {
254
349
  target: 'closing',
255
- actions: ['clearDeferredCloseActions'],
350
+ actions: ['clearDeferredCloseActions', lifecycleAction('connected')],
256
351
  },
257
352
  'SUBJECT.*': {
258
353
  actions: [
@@ -297,6 +392,7 @@ export const natsMachine = setup({
297
392
  console.log('CLOSING', event.context.connection?.getServer())
298
393
  }
299
394
  },
395
+ lifecycleAction('closing'),
300
396
  sendTo('subject', { type: 'SUBJECT.DISCONNECTED' }),
301
397
  sendTo('kv', { type: 'KV.DISCONNECTED' }),
302
398
  ],
@@ -307,33 +403,40 @@ export const natsMachine = setup({
307
403
  {
308
404
  guard: 'shouldConnectAfterClose',
309
405
  target: 'connecting',
406
+ actions: lifecycleAction('closing'),
310
407
  },
311
408
  {
312
409
  guard: 'shouldConfigureAfterClose',
313
410
  target: 'configured',
411
+ actions: lifecycleAction('closing'),
314
412
  },
315
413
  {
316
414
  target: 'closed',
415
+ actions: lifecycleAction('closing'),
317
416
  },
318
417
  ],
319
418
  onError: {
320
419
  target: 'error',
321
- actions: assign({
322
- error: ({ event }) => event.error as Error,
323
- }),
420
+ actions: [
421
+ lifecycleAction('closing'),
422
+ assign({
423
+ error: ({ event }) => event.error as Error,
424
+ }),
425
+ ],
324
426
  },
325
427
  },
326
428
  on: {
327
429
  CONFIGURE: {
328
- actions: ['configureNatsAfterClose'],
430
+ actions: ['configureNatsAfterClose', lifecycleAction('closing')],
329
431
  },
330
432
  CONNECT: {
331
- actions: ['reconnectAfterClose'],
433
+ actions: ['reconnectAfterClose', lifecycleAction('closing')],
332
434
  },
333
435
  },
334
436
  },
335
437
  closed: {
336
438
  entry: [
439
+ lifecycleAction('closed'),
337
440
  assign({
338
441
  connection: (_) => null,
339
442
  subjectManagerReady: (_) => false,
@@ -345,7 +448,7 @@ export const natsMachine = setup({
345
448
  on: {
346
449
  CONFIGURE: {
347
450
  target: 'configured',
348
- actions: ['configureNats'],
451
+ actions: ['configureNats', lifecycleAction('closed')],
349
452
  },
350
453
  RESET: {
351
454
  target: 'not_configured',
@@ -353,6 +456,7 @@ export const natsMachine = setup({
353
456
  },
354
457
  CONNECT: {
355
458
  target: 'connecting',
459
+ actions: lifecycleAction('closed'),
356
460
  },
357
461
  },
358
462
  '*': {
@@ -364,11 +468,11 @@ export const natsMachine = setup({
364
468
  },
365
469
  },
366
470
  error: {
367
- entry: ['clearDeferredCloseActions'],
471
+ entry: ['clearDeferredCloseActions', lifecycleAction('error')],
368
472
  on: {
369
473
  CONFIGURE: {
370
474
  target: 'configured',
371
- actions: ['configureNats'],
475
+ actions: ['configureNats', lifecycleAction('error')],
372
476
  },
373
477
  RESET: {
374
478
  target: 'not_configured',