@jr200-labs/xstate-nats 0.9.21 → 0.9.23
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 +75 -10
- package/dist/actions/connection.d.ts +2 -0
- package/dist/actions/connection.d.ts.map +1 -1
- package/dist/actions/connection.js +20 -9
- package/dist/actions/connection.js.map +1 -1
- package/dist/actions/subject.d.ts +5 -1
- package/dist/actions/subject.d.ts.map +1 -1
- package/dist/actions/subject.js +60 -16
- package/dist/actions/subject.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/machines/credentials.d.ts +112 -0
- package/dist/machines/credentials.d.ts.map +1 -0
- package/dist/machines/credentials.js +252 -0
- package/dist/machines/credentials.js.map +1 -0
- package/dist/machines/root.d.ts +190 -3
- package/dist/machines/root.d.ts.map +1 -1
- package/dist/machines/root.js +107 -13
- package/dist/machines/root.js.map +1 -1
- package/dist/machines/subject.d.ts +7 -2
- package/dist/machines/subject.d.ts.map +1 -1
- package/dist/machines/subject.js +11 -1
- package/dist/machines/subject.js.map +1 -1
- package/dist/telemetry.d.ts +2 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +18 -1
- package/dist/telemetry.js.map +1 -1
- package/package.json +17 -19
- package/src/actions/connection.test.ts +62 -7
- package/src/actions/connection.ts +28 -8
- package/src/actions/subject.test.ts +120 -0
- package/src/actions/subject.ts +79 -19
- package/src/index.ts +9 -0
- package/src/machines/credentials.telemetry.test.ts +66 -0
- package/src/machines/credentials.test.ts +175 -0
- package/src/machines/credentials.ts +320 -0
- package/src/machines/root.test.ts +88 -1
- package/src/machines/root.ts +115 -13
- package/src/machines/subject.test.ts +60 -0
- package/src/machines/subject.ts +18 -1
- package/src/telemetry.ts +35 -1
package/README.md
CHANGED
|
@@ -88,6 +88,49 @@ send({
|
|
|
88
88
|
})
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
+
For short-lived authentication, configure the built-in credential actor. The adapter is
|
|
92
|
+
product-neutral: an application can obtain credentials from OIDC, a service account, or another
|
|
93
|
+
source without teaching `xstate-nats` about that provider:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
credentials: {
|
|
97
|
+
refreshBeforeExpiryMs: 60_000,
|
|
98
|
+
diagnostics: true,
|
|
99
|
+
adapter: {
|
|
100
|
+
load: () => loadSessionCredentials(),
|
|
101
|
+
refresh: (current) => refreshSessionCredentials(current),
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Both adapter methods return a `NatsCredentials` value:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const requestHeaders = headers()
|
|
110
|
+
requestHeaders.set('authorization', `Bearer ${accessToken}`)
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
auth: {
|
|
114
|
+
type: 'decentralised',
|
|
115
|
+
sentinelB64,
|
|
116
|
+
user: userId,
|
|
117
|
+
pass: idToken,
|
|
118
|
+
},
|
|
119
|
+
requestHeaders,
|
|
120
|
+
expiresAt: tokenExpiryEpochMs,
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The credential actor loads once, shares concurrent callers, refreshes before expiry, and bounds
|
|
125
|
+
each adapter operation (30 seconds by default). `CONNECT` waits for ready credentials. Every
|
|
126
|
+
`SUBJECT.REQUEST` then obtains current headers immediately before sending; header preparation and
|
|
127
|
+
the NATS round trip share the request's `opts.timeout`. NATS reconnect authentication reads the
|
|
128
|
+
actor's current cached connection credential synchronously, as required by the NATS authenticator.
|
|
129
|
+
|
|
130
|
+
If loading or refresh fails, or unrefreshable credentials expire, requests fail closed and an
|
|
131
|
+
active NATS connection is closed. After the application has repaired its login/session, send
|
|
132
|
+
`CREDENTIALS.RELOAD`, then `CONNECT`. Static non-expiring `auth` configuration remains supported.
|
|
133
|
+
|
|
91
134
|
### Key-Value Operations
|
|
92
135
|
|
|
93
136
|
```typescript
|
|
@@ -160,9 +203,11 @@ The NATS machine operates in the following states:
|
|
|
160
203
|
### Main Exports
|
|
161
204
|
|
|
162
205
|
- `natsMachine`: The main XState machine for NATS operations
|
|
206
|
+
- `credentialMachine`: Generic short-lived credential lifecycle machine
|
|
163
207
|
- `KvSubscriptionKey`: Type for KV subscription keys
|
|
164
208
|
- `parseNatsResult`: Utility for parsing NATS operation results
|
|
165
209
|
- `AuthConfig`: Type for authentication configuration
|
|
210
|
+
- `NatsCredentialAdapter`, `NatsCredentialConfig`, `NatsCredentials`: Credential actor contracts
|
|
166
211
|
|
|
167
212
|
### Authentication
|
|
168
213
|
|
|
@@ -197,6 +242,7 @@ auth: {
|
|
|
197
242
|
- `CONNECT`: Establish connection
|
|
198
243
|
- `DISCONNECT`: Close connection
|
|
199
244
|
- `RESET`: Reset to initial state
|
|
245
|
+
- `CREDENTIALS.RELOAD`: Reload credentials after the application repairs its session
|
|
200
246
|
|
|
201
247
|
#### Subject Events
|
|
202
248
|
|
|
@@ -226,21 +272,36 @@ and request/reply replier.
|
|
|
226
272
|
|
|
227
273
|
### Emitted spans
|
|
228
274
|
|
|
229
|
-
| Span name
|
|
230
|
-
|
|
|
231
|
-
| `xstate.nats.subscribe`
|
|
232
|
-
| `xstate.nats.message`
|
|
233
|
-
| `xstate.nats.publish`
|
|
234
|
-
| `xstate.nats.request`
|
|
235
|
-
| `xstate.nats.reconnect`
|
|
236
|
-
| `xstate.nats.lifecycle`
|
|
237
|
-
| `xstate.nats.
|
|
238
|
-
| `xstate.nats.
|
|
275
|
+
| Span name | Emitted by | Attributes |
|
|
276
|
+
| --------------------------------- | -------------------- | ------------------------------------------------------------------------ |
|
|
277
|
+
| `xstate.nats.subscribe` | `SUBJECT.SUBSCRIBE` | `subject` |
|
|
278
|
+
| `xstate.nats.message` | per received message | `subject`, `payload.bytes` |
|
|
279
|
+
| `xstate.nats.publish` | `SUBJECT.PUBLISH` | `subject`, `payload.bytes` |
|
|
280
|
+
| `xstate.nats.request` | `SUBJECT.REQUEST` | `subject`, `payload.bytes`, `timeout.ms` |
|
|
281
|
+
| `xstate.nats.reconnect` | NATS status loop | `reconnect.type` |
|
|
282
|
+
| `xstate.nats.lifecycle` | root machine | `xstate.state`, `xstate.event` |
|
|
283
|
+
| `xstate.nats.credentials.load` | credential load | `credentials.operation`, `credentials.timeout.ms`, `credentials.outcome` |
|
|
284
|
+
| `xstate.nats.credentials.refresh` | credential refresh | `credentials.operation`, `credentials.timeout.ms`, `credentials.outcome` |
|
|
285
|
+
| `xstate.nats.kv.watch` | `KV.SUBSCRIBE` | `bucket`, `key` |
|
|
286
|
+
| `xstate.nats.kv.entry` | per KV watch entry | `bucket`, `key`, `operation` |
|
|
239
287
|
|
|
240
288
|
All error paths record exceptions on the active span, set span status to
|
|
241
289
|
`ERROR`, and emit a named event (`xstate.nats.error` / `xstate.nats.kv.error`)
|
|
242
290
|
with a truncated stack.
|
|
243
291
|
|
|
292
|
+
### Credential metrics
|
|
293
|
+
|
|
294
|
+
| Metric name | Type | Attributes |
|
|
295
|
+
| -------------------------------------------- | --------- | ---------------------- |
|
|
296
|
+
| `xstate.nats.credentials.operations` | Counter | `operation`, `outcome` |
|
|
297
|
+
| `xstate.nats.credentials.operation.duration` | Histogram | `operation`, `outcome` |
|
|
298
|
+
| `xstate.nats.credentials.state.transitions` | Counter | `state` |
|
|
299
|
+
|
|
300
|
+
Operations are `load` or `refresh`; outcomes are `success` or `error`. Durations are recorded in
|
|
301
|
+
milliseconds. These low-cardinality metrics expose authentication rate, refresh frequency,
|
|
302
|
+
latency, failures, expiry, and recovery trends without recording credential contents.
|
|
303
|
+
A registered OpenTelemetry `MeterProvider` is required to export them.
|
|
304
|
+
|
|
244
305
|
### Lifecycle diagnostics
|
|
245
306
|
|
|
246
307
|
Root machine lifecycle diagnostics are opt-in and separate from raw NATS
|
|
@@ -264,6 +325,10 @@ include state, event type, server URLs, debug/verbose flags, retry count, auth
|
|
|
264
325
|
type, and manager readiness flags. They do not include credentials, JWTs, nkeys,
|
|
265
326
|
signatures, passwords, tokens, or raw protocol frames.
|
|
266
327
|
|
|
328
|
+
Set `credentials.diagnostics: true` for sanitized credential state and operation breadcrumbs.
|
|
329
|
+
They contain only operation, outcome, duration, timeout, state, and pending-waiter count. Adapter
|
|
330
|
+
error messages and credential contents are deliberately excluded from logs and traces.
|
|
331
|
+
|
|
267
332
|
### Enabling tracing
|
|
268
333
|
|
|
269
334
|
`@opentelemetry/api` is a peer dependency — the consumer controls the installed
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ConnectionOptions, Msg, NatsConnection, Status } from '@nats-io/nats-core';
|
|
2
2
|
import { KvEntry } from '@nats-io/kv';
|
|
3
3
|
import { type AuthConfig } from './types';
|
|
4
|
+
import { CredentialActor } from '../machines/credentials';
|
|
4
5
|
export type InternalStatusEvents = {
|
|
5
6
|
type: 'NATS_CONNECTION.DISCONNECTED';
|
|
6
7
|
status: Status;
|
|
@@ -20,6 +21,7 @@ export type InternalStatusEvents = {
|
|
|
20
21
|
export declare const connectToNats: import("xstate").PromiseActorLogic<NatsConnection, {
|
|
21
22
|
opts: ConnectionOptions;
|
|
22
23
|
auth?: AuthConfig;
|
|
24
|
+
credentialActor?: CredentialActor;
|
|
23
25
|
onStatus?: (event: InternalStatusEvents) => void;
|
|
24
26
|
}, import("xstate").EventObject>;
|
|
25
27
|
export declare const disconnectNats: import("xstate").PromiseActorLogic<void, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/actions/connection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAEjB,GAAG,EACH,cAAc,EACd,MAAM,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/actions/connection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAEjB,GAAG,EACH,cAAc,EACd,MAAM,EAIP,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAA;AAkCzE,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,8BAA8B,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,8BAA8B,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5D,eAAO,MAAM,aAAa;UAKd,iBAAiB;WAChB,UAAU;sBACC,eAAe;eACtB,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI;gCA6FrD,CAAA;AAED,eAAO,MAAM,cAAc;gBACgB,cAAc,GAAG,IAAI;gCAM/D,CAAA;AAED,eAAO,MAAM,eAAe,QAAS,GAAG,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,YAiBhE,CAAA"}
|
|
@@ -1,35 +1,46 @@
|
|
|
1
1
|
import { fromPromise } from 'xstate';
|
|
2
|
-
import { credsAuthenticator, wsconnect, } from '@nats-io/nats-core';
|
|
2
|
+
import { credsAuthenticator, tokenAuthenticator, usernamePasswordAuthenticator, wsconnect, } from '@nats-io/nats-core';
|
|
3
3
|
import { withSpan } from '../telemetry';
|
|
4
|
-
|
|
4
|
+
import { getCredentials } from '../machines/credentials';
|
|
5
|
+
const makeAuthConfig = (auth, getLatest) => {
|
|
5
6
|
if (!auth) {
|
|
6
7
|
return {};
|
|
7
8
|
}
|
|
8
9
|
if (auth.type === 'decentralised') {
|
|
9
10
|
const decodedSentinel = atob(auth.sentinelB64);
|
|
10
11
|
return {
|
|
11
|
-
authenticator:
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
authenticator: [
|
|
13
|
+
credsAuthenticator(new TextEncoder().encode(decodedSentinel)),
|
|
14
|
+
usernamePasswordAuthenticator(() => getLatest?.()?.user ?? auth.user, () => getLatest?.()?.pass ?? auth.pass),
|
|
15
|
+
],
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
else if (auth.type === 'userpass') {
|
|
17
19
|
return {
|
|
18
|
-
|
|
19
|
-
pass: auth.pass,
|
|
20
|
+
authenticator: usernamePasswordAuthenticator(() => getLatest?.()?.user ?? auth.user, () => getLatest?.()?.pass ?? auth.pass),
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
23
|
else if (auth.type === 'token') {
|
|
23
24
|
return {
|
|
24
|
-
|
|
25
|
+
authenticator: tokenAuthenticator(() => getLatest?.()?.token ?? auth.token),
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
throw new Error(`Unsupported auth config type ${auth.type}`);
|
|
28
29
|
};
|
|
29
30
|
export const connectToNats = fromPromise(async ({ input, }) => {
|
|
31
|
+
const credentials = input.credentialActor
|
|
32
|
+
? await getCredentials(input.credentialActor)
|
|
33
|
+
: undefined;
|
|
34
|
+
const auth = credentials?.auth ?? input.auth;
|
|
30
35
|
const mergedOpts = {
|
|
31
36
|
...input.opts,
|
|
32
|
-
...makeAuthConfig(
|
|
37
|
+
...makeAuthConfig(auth, () => {
|
|
38
|
+
const current = input.credentialActor?.getSnapshot().context.current;
|
|
39
|
+
if (current?.expiresAt !== undefined && current.expiresAt <= Date.now()) {
|
|
40
|
+
throw new Error('NATS credentials expired');
|
|
41
|
+
}
|
|
42
|
+
return current?.auth;
|
|
43
|
+
}),
|
|
33
44
|
};
|
|
34
45
|
const debug = Boolean(mergedOpts.debug);
|
|
35
46
|
const nc = await wsconnect(mergedOpts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/actions/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAEL,kBAAkB,EAIlB,SAAS,GACV,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/actions/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NatsConnection, PublishOptions, RequestOptions, Subscription, SubscriptionOptions } from '@nats-io/nats-core';
|
|
1
|
+
import { MsgHdrs, NatsConnection, PublishOptions, RequestOptions, Subscription, SubscriptionOptions } from '@nats-io/nats-core';
|
|
2
2
|
export type SubjectSubscriptionConfig = {
|
|
3
3
|
subject: string;
|
|
4
4
|
callback: (data: any) => void;
|
|
@@ -11,6 +11,9 @@ export type RequestResult = {
|
|
|
11
11
|
ok: false;
|
|
12
12
|
error: Error;
|
|
13
13
|
};
|
|
14
|
+
export declare function rejectUnavailableRequest(event: {
|
|
15
|
+
onRequestResult?: (result: RequestResult) => void;
|
|
16
|
+
}): void;
|
|
14
17
|
export declare const subjectConsolidateState: ({ input, }: {
|
|
15
18
|
input: {
|
|
16
19
|
connection: NatsConnection | null;
|
|
@@ -29,6 +32,7 @@ export declare const subjectRequest: ({ input, }: {
|
|
|
29
32
|
callback: (data: any) => void;
|
|
30
33
|
onRequestResult?: (result: RequestResult) => void;
|
|
31
34
|
onDownloadBytes?: (bytes: number) => void;
|
|
35
|
+
requestHeaders?: () => Promise<MsgHdrs | undefined>;
|
|
32
36
|
};
|
|
33
37
|
}) => void;
|
|
34
38
|
export declare const subjectPublish: ({ input, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/actions/subject.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/actions/subject.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACP,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,mBAAmB,EAEpB,MAAM,oBAAoB,CAAA;AAU3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7B,IAAI,CAAC,EAAE,mBAAmB,CAAA;IAC1B,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAA;AAatE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;CAClD,QAIA;AAED,eAAO,MAAM,uBAAuB,eAEjC;IACD,KAAK,EAAE;QACL,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;QACjC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QAC/C,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAA;KAC5D,CAAA;CACF;IA2EG,aAAa;CAEhB,CAAA;AAED,eAAO,MAAM,cAAc,eAExB;IACD,KAAK,EAAE;QACL,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;QACjC,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,GAAG,CAAA;QACZ,IAAI,CAAC,EAAE,cAAc,CAAA;QACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAC7B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;QACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;QACzC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;KACpD,CAAA;CACF,SAkFA,CAAA;AAED,eAAO,MAAM,cAAc,eAExB;IACD,KAAK,EAAE;QACL,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;QACjC,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,GAAG,CAAA;QACZ,OAAO,CAAC,EAAE,cAAc,CAAA;QACxB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,EAAE,EAAE,IAAI,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,KAAK,IAAI,CAAA;KAC/E,CAAA;CACF,SA0BA,CAAA"}
|
package/dist/actions/subject.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
import { deadline, TimeoutError, } from '@nats-io/nats-core';
|
|
1
2
|
import { parseNatsResult } from './connection';
|
|
2
3
|
import { extractContextFromHeaders, injectContextIntoHeaders, recordError, withSpan, } from '../telemetry';
|
|
3
4
|
import { byteLength } from '../traffic';
|
|
5
|
+
function notifyRequestResult(callback, result) {
|
|
6
|
+
try {
|
|
7
|
+
callback?.(result);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
console.error('NATS request result callback failed', error);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function rejectUnavailableRequest(event) {
|
|
14
|
+
const error = new Error('NATS connection is not available');
|
|
15
|
+
notifyRequestResult(event.onRequestResult, { ok: false, error });
|
|
16
|
+
if (!event.onRequestResult)
|
|
17
|
+
console.error(error.message);
|
|
18
|
+
}
|
|
4
19
|
export const subjectConsolidateState = ({ input, }) => {
|
|
5
20
|
const { connection, currentSubscriptions, targetSubscriptions } = input;
|
|
6
21
|
if (!connection) {
|
|
@@ -65,7 +80,7 @@ export const subjectConsolidateState = ({ input, }) => {
|
|
|
65
80
|
};
|
|
66
81
|
};
|
|
67
82
|
export const subjectRequest = ({ input, }) => {
|
|
68
|
-
const { connection, subject, payload, opts, callback, onRequestResult, onDownloadBytes } = input;
|
|
83
|
+
const { connection, subject, payload, opts, callback, onRequestResult, onDownloadBytes, requestHeaders, } = input;
|
|
69
84
|
if (!connection) {
|
|
70
85
|
throw new Error('NATS connection is not available');
|
|
71
86
|
}
|
|
@@ -80,26 +95,55 @@ export const subjectRequest = ({ input, }) => {
|
|
|
80
95
|
// declares `timeout` as required but nats-core only enforces it when
|
|
81
96
|
// opts is provided; cast preserves the "no opts = use conn default"
|
|
82
97
|
// contract.
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
const request = (providedHeaders, timeout = opts?.timeout) => {
|
|
99
|
+
const headers = injectContextIntoHeaders(opts?.headers);
|
|
100
|
+
providedHeaders?.keys().forEach((key) => {
|
|
101
|
+
const value = providedHeaders.get(key);
|
|
102
|
+
if (value)
|
|
103
|
+
headers.set(key, value);
|
|
104
|
+
});
|
|
105
|
+
const requestOpts = (opts ? { ...opts, headers } : { headers });
|
|
106
|
+
if (timeout !== undefined)
|
|
107
|
+
requestOpts.timeout = timeout;
|
|
108
|
+
try {
|
|
109
|
+
return connection.request(subject, payload, requestOpts);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return Promise.reject(error);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const timeout = opts?.timeout;
|
|
116
|
+
const startedAt = performance.now();
|
|
117
|
+
const preparedHeaders = requestHeaders ? Promise.resolve().then(requestHeaders) : undefined;
|
|
118
|
+
const send = preparedHeaders
|
|
119
|
+
? (timeout === undefined ? preparedHeaders : deadline(preparedHeaders, timeout)).then((headers) => {
|
|
120
|
+
if (timeout === undefined)
|
|
121
|
+
return request(headers);
|
|
122
|
+
const remaining = Math.floor(timeout - (performance.now() - startedAt));
|
|
123
|
+
if (remaining <= 0)
|
|
124
|
+
throw new TimeoutError();
|
|
125
|
+
return request(headers, remaining);
|
|
126
|
+
})
|
|
127
|
+
: request();
|
|
128
|
+
const fail = (err) => {
|
|
96
129
|
recordError(span, 'xstate.nats.error', err);
|
|
97
130
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
98
|
-
onRequestResult
|
|
131
|
+
notifyRequestResult(onRequestResult, { ok: false, error });
|
|
99
132
|
if (!onRequestResult) {
|
|
100
133
|
console.error(`RequestReply error for subject "${subject}"`, err);
|
|
101
134
|
}
|
|
102
|
-
}
|
|
135
|
+
};
|
|
136
|
+
return send.then((msg) => {
|
|
137
|
+
try {
|
|
138
|
+
onDownloadBytes?.(msg.data?.length ?? 0);
|
|
139
|
+
callback(parseNatsResult(msg));
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
fail(error);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
notifyRequestResult(onRequestResult, { ok: true });
|
|
146
|
+
}, fail);
|
|
103
147
|
});
|
|
104
148
|
};
|
|
105
149
|
export const subjectPublish = ({ input, }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/actions/subject.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/actions/subject.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { kvManagerLogic, type Context as KvContext, type ExternalEvents as KvEve
|
|
|
4
4
|
export { KvSubscriptionKey, type KvSubscriptionConfig } from './actions/kv';
|
|
5
5
|
export { parseNatsResult } from './actions/connection';
|
|
6
6
|
export { type AuthConfig } from './actions/types';
|
|
7
|
+
export { credentialMachine, getCredentials, type CredentialActor, type CredentialContext, type NatsCredentialAdapter, type NatsCredentialConfig, type NatsCredentials, } from './machines/credentials';
|
|
7
8
|
export { byteLength as natsTrafficByteLength, createEmptyTrafficMetrics, recordTrafficMetric, resetTrafficAll, resetTrafficDownload, resetTrafficUpload, type NatsTrafficEvent, type NatsTrafficMetricBucket, type NatsTrafficMetrics, type NatsTrafficMetricSource, type NatsTrafficRecordEvent, type NatsTrafficResetEvent, } from './traffic';
|
|
8
9
|
export { type NatsConnectionConfig, type Context as NatsContext, type ExternalEvents as NatsEvent, } from './machines/root';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,mBAAmB,EACnB,KAAK,OAAO,IAAI,cAAc,EAC9B,KAAK,cAAc,IAAI,YAAY,GACpC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,OAAO,IAAI,SAAS,EACzB,KAAK,cAAc,IAAI,OAAO,GAC/B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EACL,UAAU,IAAI,qBAAqB,EACnC,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,IAAI,WAAW,EAC3B,KAAK,cAAc,IAAI,SAAS,GACjC,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,mBAAmB,EACnB,KAAK,OAAO,IAAI,cAAc,EAC9B,KAAK,cAAc,IAAI,YAAY,GACpC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,OAAO,IAAI,SAAS,EACzB,KAAK,cAAc,IAAI,OAAO,GAC/B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,UAAU,IAAI,qBAAqB,EACnC,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,IAAI,WAAW,EAC3B,KAAK,cAAc,IAAI,SAAS,GACjC,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,5 +3,6 @@ export { subjectManagerLogic, } from './machines/subject';
|
|
|
3
3
|
export { kvManagerLogic, } from './machines/kv';
|
|
4
4
|
export { KvSubscriptionKey } from './actions/kv';
|
|
5
5
|
export { parseNatsResult } from './actions/connection';
|
|
6
|
+
export { credentialMachine, getCredentials, } from './machines/credentials';
|
|
6
7
|
export { byteLength as natsTrafficByteLength, createEmptyTrafficMetrics, recordTrafficMetric, resetTrafficAll, resetTrafficDownload, resetTrafficUpload, } from './traffic';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,mBAAmB,GAGpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,cAAc,GAGf,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAA6B,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EACL,UAAU,IAAI,qBAAqB,EACnC,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GAOnB,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,mBAAmB,GAGpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,cAAc,GAGf,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAA6B,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EACL,iBAAiB,EACjB,cAAc,GAMf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,UAAU,IAAI,qBAAqB,EACnC,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GAOnB,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { MsgHdrs } from '@nats-io/nats-core';
|
|
2
|
+
import { ActorRefFrom } from 'xstate';
|
|
3
|
+
import { type AuthConfig } from '../actions/types';
|
|
4
|
+
export interface NatsCredentials {
|
|
5
|
+
auth?: AuthConfig;
|
|
6
|
+
requestHeaders?: MsgHdrs;
|
|
7
|
+
/** Epoch milliseconds after which these credentials must not be used. Use the earliest expiry. */
|
|
8
|
+
expiresAt?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface NatsCredentialAdapter {
|
|
11
|
+
load: () => Promise<NatsCredentials>;
|
|
12
|
+
refresh?: (current: NatsCredentials) => Promise<NatsCredentials>;
|
|
13
|
+
}
|
|
14
|
+
export interface NatsCredentialConfig {
|
|
15
|
+
adapter: NatsCredentialAdapter;
|
|
16
|
+
/** Refresh this long before expiry. Defaults to 60 seconds. */
|
|
17
|
+
refreshBeforeExpiryMs?: number;
|
|
18
|
+
/** Maximum duration of one adapter load or refresh. Defaults to 30 seconds. */
|
|
19
|
+
operationTimeoutMs?: number;
|
|
20
|
+
/** Called when credentials expire or cannot be loaded/refreshed. */
|
|
21
|
+
onUnavailable?: (error: Error) => void;
|
|
22
|
+
/** Emit sanitized credential lifecycle debug logs. */
|
|
23
|
+
diagnostics?: boolean;
|
|
24
|
+
}
|
|
25
|
+
type CredentialResult = {
|
|
26
|
+
ok: true;
|
|
27
|
+
credentials: NatsCredentials;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: Error;
|
|
31
|
+
};
|
|
32
|
+
type Waiter = (result: CredentialResult) => void;
|
|
33
|
+
export interface CredentialContext {
|
|
34
|
+
config: NatsCredentialConfig;
|
|
35
|
+
current?: NatsCredentials;
|
|
36
|
+
waiters: Waiter[];
|
|
37
|
+
error?: Error;
|
|
38
|
+
}
|
|
39
|
+
export declare const credentialMachine: import("xstate").StateMachine<CredentialContext, {
|
|
40
|
+
type: 'CREDENTIALS.GET';
|
|
41
|
+
reply: Waiter;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'CREDENTIALS.RELOAD';
|
|
44
|
+
}, {
|
|
45
|
+
[x: string]: import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<NatsCredentials, NatsCredentialConfig, import("xstate").EventObject> | import("xstate").PromiseActorLogic<NatsCredentials, {
|
|
46
|
+
config: NatsCredentialConfig;
|
|
47
|
+
current: NatsCredentials;
|
|
48
|
+
}, import("xstate").EventObject>> | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
src: "load";
|
|
51
|
+
logic: import("xstate").PromiseActorLogic<NatsCredentials, NatsCredentialConfig, import("xstate").EventObject>;
|
|
52
|
+
id: string | undefined;
|
|
53
|
+
} | {
|
|
54
|
+
src: "refresh";
|
|
55
|
+
logic: import("xstate").PromiseActorLogic<NatsCredentials, {
|
|
56
|
+
config: NatsCredentialConfig;
|
|
57
|
+
current: NatsCredentials;
|
|
58
|
+
}, import("xstate").EventObject>;
|
|
59
|
+
id: string | undefined;
|
|
60
|
+
}, {
|
|
61
|
+
type: "acceptCredentials";
|
|
62
|
+
params: import("xstate").NonReducibleUnknown;
|
|
63
|
+
} | {
|
|
64
|
+
type: "markExpired";
|
|
65
|
+
params: import("xstate").NonReducibleUnknown;
|
|
66
|
+
} | {
|
|
67
|
+
type: "notifyUnavailable";
|
|
68
|
+
params: unknown;
|
|
69
|
+
} | {
|
|
70
|
+
type: "queue";
|
|
71
|
+
params: import("xstate").NonReducibleUnknown;
|
|
72
|
+
} | {
|
|
73
|
+
type: "rejectWaiters";
|
|
74
|
+
params: import("xstate").NonReducibleUnknown;
|
|
75
|
+
} | {
|
|
76
|
+
type: "replyReady";
|
|
77
|
+
params: unknown;
|
|
78
|
+
} | {
|
|
79
|
+
type: "storeCredentials";
|
|
80
|
+
params: import("xstate").NonReducibleUnknown;
|
|
81
|
+
}, {
|
|
82
|
+
type: "canRefresh";
|
|
83
|
+
params: unknown;
|
|
84
|
+
} | {
|
|
85
|
+
type: "hasExpiry";
|
|
86
|
+
params: unknown;
|
|
87
|
+
} | {
|
|
88
|
+
type: "isExpired";
|
|
89
|
+
params: unknown;
|
|
90
|
+
} | {
|
|
91
|
+
type: "outputExpired";
|
|
92
|
+
params: unknown;
|
|
93
|
+
} | {
|
|
94
|
+
type: "outputShouldRefresh";
|
|
95
|
+
params: unknown;
|
|
96
|
+
} | {
|
|
97
|
+
type: "shouldRefreshNow";
|
|
98
|
+
params: unknown;
|
|
99
|
+
}, "credentialDeadline", "expired" | "failed" | "loading" | "ready" | "refreshing", string, NatsCredentialConfig, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, {
|
|
100
|
+
id: "credentials";
|
|
101
|
+
states: {
|
|
102
|
+
readonly loading: {};
|
|
103
|
+
readonly ready: {};
|
|
104
|
+
readonly refreshing: {};
|
|
105
|
+
readonly expired: {};
|
|
106
|
+
readonly failed: {};
|
|
107
|
+
};
|
|
108
|
+
}>;
|
|
109
|
+
export type CredentialActor = ActorRefFrom<typeof credentialMachine>;
|
|
110
|
+
export declare function getCredentials(actor: CredentialActor): Promise<NatsCredentials>;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/machines/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,YAAY,EAA8B,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,qBAAqB,CAAA;IAC9B,+DAA+D;IAC/D,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACtC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,KAAK,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAA;AAEhG,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;AAEhD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AA0FD,eAAO,MAAM,iBAAiB;UAxFR,iBAAiB;WAAS,MAAM;;UAAa,oBAAoB;;;gBAmGlD,oBAAoB;iBAAW,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsKjF,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAU/E"}
|