@pellux/goodvibes-sdk 0.18.52 → 0.18.53
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/dist/_internal/errors/index.d.ts +1 -1
- package/dist/_internal/errors/index.d.ts.map +1 -1
- package/dist/_internal/errors/index.js +3 -2
- package/dist/_internal/platform/auth/oauth-client.d.ts +11 -4
- package/dist/_internal/platform/auth/oauth-client.d.ts.map +1 -1
- package/dist/_internal/platform/auth/oauth-client.js +11 -4
- package/dist/_internal/platform/config/subscriptions.d.ts +13 -0
- package/dist/_internal/platform/config/subscriptions.d.ts.map +1 -1
- package/dist/_internal/platform/config/subscriptions.js +13 -0
- package/dist/_internal/platform/version.js +1 -1
- package/dist/_internal/transport-http/http-core.d.ts +7 -0
- package/dist/_internal/transport-http/http-core.d.ts.map +1 -1
- package/dist/_internal/transport-http/http-core.js +55 -38
- package/dist/_internal/transport-http/http.d.ts.map +1 -1
- package/dist/_internal/transport-http/http.js +8 -1
- package/dist/_internal/transport-http/sse-stream.d.ts.map +1 -1
- package/dist/_internal/transport-http/sse-stream.js +17 -8
- package/dist/_internal/transport-realtime/index.d.ts +1 -1
- package/dist/_internal/transport-realtime/index.d.ts.map +1 -1
- package/dist/_internal/transport-realtime/index.js +1 -1
- package/dist/_internal/transport-realtime/runtime-events.d.ts +2 -0
- package/dist/_internal/transport-realtime/runtime-events.d.ts.map +1 -1
- package/dist/_internal/transport-realtime/runtime-events.js +32 -8
- package/dist/auth.d.ts +23 -21
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +24 -9
- package/package.json +1 -1
|
@@ -161,5 +161,5 @@ export declare class HttpStatusError extends GoodVibesSdkError {
|
|
|
161
161
|
constructor(message: string, options?: GoodVibesSdkErrorOptions);
|
|
162
162
|
}
|
|
163
163
|
export declare function isStructuredDaemonErrorBody(value: unknown): value is StructuredDaemonErrorBody;
|
|
164
|
-
export declare function createHttpStatusError(status: number, url: string, method: string, body: unknown): HttpStatusError;
|
|
164
|
+
export declare function createHttpStatusError(status: number, url: string, method: string, body: unknown, fallbackHint?: string): HttpStatusError;
|
|
165
165
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/errors/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/errors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -218,7 +218,7 @@ export class HttpStatusError extends GoodVibesSdkError {
|
|
|
218
218
|
export function isStructuredDaemonErrorBody(value) {
|
|
219
219
|
return typeof value === 'object' && value !== null && typeof value.error === 'string';
|
|
220
220
|
}
|
|
221
|
-
export function createHttpStatusError(status, url, method, body) {
|
|
221
|
+
export function createHttpStatusError(status, url, method, body, fallbackHint) {
|
|
222
222
|
if (isStructuredDaemonErrorBody(body)) {
|
|
223
223
|
return new HttpStatusError(body.error, {
|
|
224
224
|
code: body.code,
|
|
@@ -229,7 +229,7 @@ export function createHttpStatusError(status, url, method, body) {
|
|
|
229
229
|
url,
|
|
230
230
|
method,
|
|
231
231
|
body,
|
|
232
|
-
hint: body.hint,
|
|
232
|
+
hint: body.hint ?? fallbackHint,
|
|
233
233
|
provider: body.provider,
|
|
234
234
|
operation: body.operation,
|
|
235
235
|
phase: body.phase,
|
|
@@ -247,5 +247,6 @@ export function createHttpStatusError(status, url, method, body) {
|
|
|
247
247
|
url,
|
|
248
248
|
method,
|
|
249
249
|
body,
|
|
250
|
+
hint: fallbackHint,
|
|
250
251
|
});
|
|
251
252
|
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OAuthClient —
|
|
2
|
+
* OAuthClient — OAuth flows for **daemon authentication**.
|
|
3
3
|
*
|
|
4
|
-
* Wraps the pure functions in `oauth-core.ts` behind a class
|
|
5
|
-
* callers can inject config once and call methods, rather than
|
|
6
|
-
* `OAuthProviderConfig` through every call.
|
|
4
|
+
* Wraps the pure PKCE/OAuth 2.0 functions in `oauth-core.ts` behind a class
|
|
5
|
+
* boundary so callers can inject config once and call methods, rather than
|
|
6
|
+
* threading `OAuthProviderConfig` through every call.
|
|
7
|
+
*
|
|
8
|
+
* This client handles authentication between the SDK and the goodvibes daemon.
|
|
9
|
+
* For OAuth flows that subscribe to external AI providers (OpenAI, Anthropic,
|
|
10
|
+
* etc.), see {@link SubscriptionManager} in
|
|
11
|
+
* `../config/subscriptions.ts`.
|
|
12
|
+
*
|
|
13
|
+
* @see SubscriptionManager — OAuth flows for provider subscriptions.
|
|
7
14
|
*/
|
|
8
15
|
import type { OAuthProviderConfig } from '../config/subscriptions.js';
|
|
9
16
|
export type { OAuthStartState, OAuthTokenPayload } from './oauth-types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-client.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/auth/oauth-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth-client.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/auth/oauth-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,qBAAa,WAAW;;gBAGV,MAAM,EAAE,mBAAmB;IAIvC;;;OAGG;IACG,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,eAAe,CAAC;IAI5B;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI9B;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIpE;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D,6DAA6D;IAC7D,IAAI,MAAM,IAAI,mBAAmB,CAEhC;CACF"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OAuthClient —
|
|
2
|
+
* OAuthClient — OAuth flows for **daemon authentication**.
|
|
3
3
|
*
|
|
4
|
-
* Wraps the pure functions in `oauth-core.ts` behind a class
|
|
5
|
-
* callers can inject config once and call methods, rather than
|
|
6
|
-
* `OAuthProviderConfig` through every call.
|
|
4
|
+
* Wraps the pure PKCE/OAuth 2.0 functions in `oauth-core.ts` behind a class
|
|
5
|
+
* boundary so callers can inject config once and call methods, rather than
|
|
6
|
+
* threading `OAuthProviderConfig` through every call.
|
|
7
|
+
*
|
|
8
|
+
* This client handles authentication between the SDK and the goodvibes daemon.
|
|
9
|
+
* For OAuth flows that subscribe to external AI providers (OpenAI, Anthropic,
|
|
10
|
+
* etc.), see {@link SubscriptionManager} in
|
|
11
|
+
* `../config/subscriptions.ts`.
|
|
12
|
+
*
|
|
13
|
+
* @see SubscriptionManager — OAuth flows for provider subscriptions.
|
|
7
14
|
*/
|
|
8
15
|
import { buildOAuthAuthorizationStart, decodeJwtPayload, exchangeOAuthAuthorizationCode, refreshOAuthAccessToken, } from '../runtime/auth/oauth-core.js';
|
|
9
16
|
export class OAuthClient {
|
|
@@ -41,6 +41,19 @@ export interface ProviderSubscription {
|
|
|
41
41
|
readonly createdAt: number;
|
|
42
42
|
readonly updatedAt: number;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* SubscriptionManager — OAuth flows for **provider subscriptions**.
|
|
46
|
+
*
|
|
47
|
+
* Manages OAuth-based subscriptions to external AI providers (OpenAI,
|
|
48
|
+
* Anthropic, Gemini, etc.) including authorization URL generation, code
|
|
49
|
+
* exchange, token refresh, and persisting credentials to disk.
|
|
50
|
+
*
|
|
51
|
+
* This class handles provider-subscription OAuth on behalf of the daemon.
|
|
52
|
+
* For OAuth flows that authenticate the SDK client with the goodvibes daemon
|
|
53
|
+
* itself, see {@link OAuthClient} in `../auth/oauth-client.ts`.
|
|
54
|
+
*
|
|
55
|
+
* @see OAuthClient — OAuth flows for daemon authentication.
|
|
56
|
+
*/
|
|
44
57
|
export declare class SubscriptionManager {
|
|
45
58
|
private readonly path;
|
|
46
59
|
constructor(path: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/config/subscriptions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/config/subscriptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,19 @@ function isSubscriptionExpired(expiresAt, bufferMs = 60_000) {
|
|
|
6
6
|
return false;
|
|
7
7
|
return Date.now() + bufferMs >= expiresAt;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* SubscriptionManager — OAuth flows for **provider subscriptions**.
|
|
11
|
+
*
|
|
12
|
+
* Manages OAuth-based subscriptions to external AI providers (OpenAI,
|
|
13
|
+
* Anthropic, Gemini, etc.) including authorization URL generation, code
|
|
14
|
+
* exchange, token refresh, and persisting credentials to disk.
|
|
15
|
+
*
|
|
16
|
+
* This class handles provider-subscription OAuth on behalf of the daemon.
|
|
17
|
+
* For OAuth flows that authenticate the SDK client with the goodvibes daemon
|
|
18
|
+
* itself, see {@link OAuthClient} in `../auth/oauth-client.ts`.
|
|
19
|
+
*
|
|
20
|
+
* @see OAuthClient — OAuth flows for daemon authentication.
|
|
21
|
+
*/
|
|
9
22
|
export class SubscriptionManager {
|
|
10
23
|
path;
|
|
11
24
|
constructor(path) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
let version = '0.18.
|
|
3
|
+
let version = '0.18.53';
|
|
4
4
|
try {
|
|
5
5
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
|
|
6
6
|
version = pkg.version ?? version;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HttpStatusError } from '../errors/index.js';
|
|
1
2
|
import { type AuthTokenResolver, type HeaderResolver } from './auth.js';
|
|
2
3
|
import { type HttpRetryPolicy } from './retry.js';
|
|
3
4
|
import { type TransportPaths } from './paths.js';
|
|
@@ -48,6 +49,12 @@ export interface HttpJsonTransport {
|
|
|
48
49
|
requestJson<T>(pathOrUrl: string, options?: HttpJsonRequestOptions): Promise<T>;
|
|
49
50
|
resolveContractRequest(method: string, path: string, input?: Record<string, unknown>): ResolvedContractRequest;
|
|
50
51
|
}
|
|
52
|
+
export declare function createTransportError(status: number, url: string, method: string, body: unknown, retryAfterMs?: number): HttpStatusError & {
|
|
53
|
+
readonly transport: TransportJsonError;
|
|
54
|
+
};
|
|
55
|
+
export declare function createNetworkTransportError(error: unknown, url: string, method: string): HttpStatusError & {
|
|
56
|
+
readonly transport: TransportJsonError;
|
|
57
|
+
};
|
|
51
58
|
export declare function createJsonRequestInit(token: string | null | undefined, body?: unknown, method?: string, headers?: HeadersInit, signal?: AbortSignal, defaultHeaders?: HeadersInit): RequestInit;
|
|
52
59
|
export declare const createJsonInit: typeof createJsonRequestInit;
|
|
53
60
|
export declare function createFetch(fetchImpl?: typeof fetch, fallbackFetch?: typeof fetch): typeof fetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-core.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http-core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-core.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Synced from packages/transport-http/src/http-core.ts
|
|
2
2
|
// Extracted from legacy source: src/runtime/transports/http-json-transport.ts
|
|
3
|
+
import { ConfigurationError, ContractError, HttpStatusError, createHttpStatusError } from '../errors/index.js';
|
|
3
4
|
import { sleepWithSignal } from './backoff.js';
|
|
4
5
|
import { mergeHeaders, normalizeAuthToken, resolveAuthToken, resolveHeaders } from './auth.js';
|
|
5
6
|
import { getHttpRetryDelay, isRetryableHttpStatus, isRetryableNetworkError, resolveHttpRetryPolicy, } from './retry.js';
|
|
@@ -7,9 +8,6 @@ import { buildUrl, createTransportPaths } from './paths.js';
|
|
|
7
8
|
function isPlainObject(value) {
|
|
8
9
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
10
|
}
|
|
10
|
-
function isRecord(value) {
|
|
11
|
-
return typeof value === 'object' && value !== null;
|
|
12
|
-
}
|
|
13
11
|
function applyHeaderSource(target, source) {
|
|
14
12
|
if (!source)
|
|
15
13
|
return;
|
|
@@ -38,51 +36,70 @@ function mergeHeaderRecord(...sources) {
|
|
|
38
36
|
}
|
|
39
37
|
return merged;
|
|
40
38
|
}
|
|
41
|
-
function
|
|
42
|
-
if (
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
function inferTransportHint(status, url, retryAfterMs) {
|
|
40
|
+
if (status === 0)
|
|
41
|
+
return `Transport could not reach ${url}. Verify the baseUrl is reachable.`;
|
|
42
|
+
if (status === 401)
|
|
43
|
+
return 'Check your authentication token or credentials.';
|
|
44
|
+
if (status === 403)
|
|
45
|
+
return 'Valid credentials but insufficient permissions for this operation.';
|
|
46
|
+
if (status === 404)
|
|
47
|
+
return 'The requested resource was not found.';
|
|
48
|
+
if (status === 408)
|
|
49
|
+
return 'The request timed out. Consider retrying.';
|
|
50
|
+
if (status === 429) {
|
|
51
|
+
return retryAfterMs !== undefined
|
|
52
|
+
? `Rate limit exceeded. Retry after ${retryAfterMs}ms.`
|
|
53
|
+
: 'Rate limit exceeded. Back off and retry.';
|
|
47
54
|
}
|
|
48
|
-
|
|
55
|
+
if (status >= 500)
|
|
56
|
+
return 'Remote server error. The service may be temporarily unavailable.';
|
|
57
|
+
return undefined;
|
|
49
58
|
}
|
|
50
|
-
function createTransportError(status, url, method, body, retryAfterMs) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
+
export function createTransportError(status, url, method, body, retryAfterMs) {
|
|
60
|
+
const inferred = inferTransportHint(status, url, retryAfterMs);
|
|
61
|
+
const baseError = createHttpStatusError(status, url, method, body, inferred);
|
|
62
|
+
const transportPayload = {
|
|
63
|
+
status,
|
|
64
|
+
body,
|
|
65
|
+
url,
|
|
66
|
+
method,
|
|
67
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
68
|
+
};
|
|
69
|
+
return Object.assign(baseError, {
|
|
70
|
+
transport: transportPayload,
|
|
71
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
59
72
|
});
|
|
60
73
|
}
|
|
61
|
-
|
|
62
|
-
* Creates a transport error representing a network-level failure (no HTTP response received).
|
|
63
|
-
*
|
|
64
|
-
* Note: `Error.cause` (set via `Object.assign`) is the authoritative standard-compliant
|
|
65
|
-
* cause field. The inner `transport.cause` mirrors it for callers that inspect the raw
|
|
66
|
-
* transport payload — treat `Error.cause` as the source of truth.
|
|
67
|
-
*/
|
|
68
|
-
function createNetworkTransportError(error, url, method) {
|
|
74
|
+
export function createNetworkTransportError(error, url, method) {
|
|
69
75
|
const message = error instanceof Error && error.message.trim()
|
|
70
76
|
? error.message.trim()
|
|
71
77
|
: `Transport request failed before receiving a response for ${url}`;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
const hint = `Transport could not reach ${url}. Verify the baseUrl is reachable.`;
|
|
79
|
+
const networkError = new HttpStatusError(message, {
|
|
80
|
+
category: 'network',
|
|
81
|
+
source: 'transport',
|
|
82
|
+
recoverable: true,
|
|
83
|
+
url,
|
|
84
|
+
method,
|
|
85
|
+
body: { error: message },
|
|
86
|
+
hint,
|
|
81
87
|
});
|
|
88
|
+
if (error !== undefined) {
|
|
89
|
+
Object.defineProperty(networkError, 'cause', { value: error, writable: true, configurable: true });
|
|
90
|
+
}
|
|
91
|
+
const transportPayload = {
|
|
92
|
+
status: 0,
|
|
93
|
+
body: { error: message },
|
|
94
|
+
url,
|
|
95
|
+
method,
|
|
96
|
+
cause: error,
|
|
97
|
+
};
|
|
98
|
+
return Object.assign(networkError, { transport: transportPayload });
|
|
82
99
|
}
|
|
83
100
|
function toStringValue(value, key) {
|
|
84
101
|
if (value === undefined || value === null) {
|
|
85
|
-
throw new
|
|
102
|
+
throw new ContractError(`Missing required path parameter "${key}"`);
|
|
86
103
|
}
|
|
87
104
|
return String(value);
|
|
88
105
|
}
|
|
@@ -127,7 +144,7 @@ export const createJsonInit = createJsonRequestInit;
|
|
|
127
144
|
export function createFetch(fetchImpl, fallbackFetch) {
|
|
128
145
|
const resolved = fetchImpl ?? fallbackFetch ?? globalThis.fetch;
|
|
129
146
|
if (typeof resolved !== 'function') {
|
|
130
|
-
throw new
|
|
147
|
+
throw new ConfigurationError('Fetch implementation is required');
|
|
131
148
|
}
|
|
132
149
|
return resolved.bind(globalThis);
|
|
133
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EAEX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,kBAAkB,GACnB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC/B,CAAC;AA2CF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EAEX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,kBAAkB,GACnB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC/B,CAAC;AA2CF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAwD7D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAmBhF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Synced from packages/transport-http/src/http.ts
|
|
2
|
-
import { ConfigurationError, ContractError, HttpStatusError, createHttpStatusError } from '../errors/index.js';
|
|
2
|
+
import { ConfigurationError, ContractError, GoodVibesSdkError, HttpStatusError, createHttpStatusError } from '../errors/index.js';
|
|
3
3
|
import { mergeHeaders, resolveAuthToken, resolveHeaders, } from './auth.js';
|
|
4
4
|
import { computeBackoffDelay, normalizeBackoffPolicy, sleepWithSignal, } from './backoff.js';
|
|
5
5
|
import { DEFAULT_HTTP_RETRY_POLICY, getHttpRetryDelay, isRetryableHttpStatus, isRetryableNetworkError, normalizeHttpRetryPolicy, resolveHttpRetryPolicy, } from './retry.js';
|
|
@@ -35,6 +35,11 @@ function inferTransportHint(status, url, retryAfterMs) {
|
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
37
|
export function normalizeTransportError(error) {
|
|
38
|
+
// Fast path: already a structured SDK error — return directly, no re-wrapping needed.
|
|
39
|
+
// Covers HttpStatusError (subclass) and GoodVibesSdkError (e.g. SSE stream errors) alike.
|
|
40
|
+
if (error instanceof GoodVibesSdkError) {
|
|
41
|
+
return error;
|
|
42
|
+
}
|
|
38
43
|
if (isTransportError(error)) {
|
|
39
44
|
const { status, url, body, method, retryAfterMs, cause } = error.transport;
|
|
40
45
|
const resolvedMethod = typeof method === 'string' ? method : 'GET';
|
|
@@ -67,6 +72,8 @@ export function normalizeTransportError(error) {
|
|
|
67
72
|
});
|
|
68
73
|
}
|
|
69
74
|
if (error instanceof Error) {
|
|
75
|
+
// Defensive string-match fallback for non-SDK errors that slip through.
|
|
76
|
+
// With structured throws in http-core.ts, these paths are rarely exercised.
|
|
70
77
|
if (error.message === 'Fetch implementation is required' || error.message === 'Transport baseUrl is required') {
|
|
71
78
|
return new ConfigurationError(error.message);
|
|
72
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-stream.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/sse-stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sse-stream.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/sse-stream.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkC,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChG;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;CAC5C;AAWD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASpD;AAqCD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,uBAAuB,EACjC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,IAAI,CAAC,CAmLrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Synced from packages/transport-http/src/sse-stream.ts
|
|
2
2
|
// Extracted from legacy source: src/runtime/transports/sse-stream.ts
|
|
3
|
+
import { GoodVibesSdkError } from '../errors/index.js';
|
|
3
4
|
import { sleepWithSignal } from './backoff.js';
|
|
4
5
|
import { mergeHeaders, resolveAuthToken } from './auth.js';
|
|
5
6
|
import { getStreamReconnectDelay, normalizeStreamReconnectPolicy, } from './reconnect.js';
|
|
@@ -23,14 +24,21 @@ function createStreamError(status, url, body) {
|
|
|
23
24
|
const message = body.trim()
|
|
24
25
|
? `Unable to open SSE stream: ${status} ${body}`.trim()
|
|
25
26
|
: `Unable to open SSE stream: ${status}`;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
27
|
+
const error = new GoodVibesSdkError(message, {
|
|
28
|
+
category: 'network',
|
|
29
|
+
source: 'transport',
|
|
30
|
+
recoverable: status === 0 || status >= 500,
|
|
31
|
+
url,
|
|
32
|
+
method: 'GET',
|
|
33
|
+
...(status > 0 ? { status } : {}),
|
|
33
34
|
});
|
|
35
|
+
const transportPayload = {
|
|
36
|
+
status,
|
|
37
|
+
body,
|
|
38
|
+
url,
|
|
39
|
+
method: 'GET',
|
|
40
|
+
};
|
|
41
|
+
return Object.assign(error, { transport: transportPayload });
|
|
34
42
|
}
|
|
35
43
|
function reportStreamError(error, handlers) {
|
|
36
44
|
if (handlers.onError) {
|
|
@@ -187,7 +195,8 @@ export async function openServerSentEventStream(fetchImpl, url, handlers, option
|
|
|
187
195
|
return;
|
|
188
196
|
}
|
|
189
197
|
reconnectAttempts = nextAttempt;
|
|
190
|
-
|
|
198
|
+
// Use the same 1-based attempt counter as the WS connector for a symmetric schedule.
|
|
199
|
+
const delayMs = getStreamReconnectDelay(nextAttempt, reconnectPolicy);
|
|
191
200
|
handlers.onReconnect?.({ attempt: nextAttempt, delayMs });
|
|
192
201
|
handlers.onError?.(error);
|
|
193
202
|
try {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { DomainEventConnector, DomainEvents, SerializedEventEnvelope, } from './domain-events.js';
|
|
2
2
|
export { createRemoteDomainEvents, forSession } from './domain-events.js';
|
|
3
3
|
export type { RemoteRuntimeEvents, SerializedRuntimeEnvelope } from './runtime-events.js';
|
|
4
|
-
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, forSessionRuntime, } from './runtime-events.js';
|
|
4
|
+
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, DEFAULT_WS_MAX_ATTEMPTS, forSessionRuntime, } from './runtime-events.js';
|
|
5
5
|
export type { RuntimeEventConnectorOptions } from './runtime-events.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { createRemoteDomainEvents, forSession } from './domain-events.js';
|
|
2
|
-
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, forSessionRuntime, } from './runtime-events.js';
|
|
2
|
+
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, DEFAULT_WS_MAX_ATTEMPTS, forSessionRuntime, } from './runtime-events.js';
|
|
@@ -39,6 +39,8 @@ export interface RuntimeEventConnectorOptions {
|
|
|
39
39
|
readonly onError?: (error: unknown) => void;
|
|
40
40
|
}
|
|
41
41
|
type AuthTokenSource = string | null | undefined | AuthTokenResolver;
|
|
42
|
+
/** Default max reconnect attempts for WebSocket connections (finite to prevent infinite auth loops). */
|
|
43
|
+
export declare const DEFAULT_WS_MAX_ATTEMPTS = 10;
|
|
42
44
|
export declare function createRemoteRuntimeEvents<TEvent extends RuntimeEventRecord = RuntimeEventRecord>(connect: DomainEventConnector<RuntimeEventDomain, TEvent>): RemoteRuntimeEvents<TEvent>;
|
|
43
45
|
export declare function buildEventSourceUrl(baseUrl: string, domain: RuntimeEventDomain): string;
|
|
44
46
|
export declare function buildWebSocketUrl(baseUrl: string, domains: readonly RuntimeEventDomain[]): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/runtime-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"runtime-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/runtime-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAI3B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,kBAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IAC1F,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IACpF,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,KAAK,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAErE,wGAAwG;AACxG,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAK1C,wBAAgB,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,EAC9F,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,CAAC,GACxD,mBAAmB,CAAC,MAAM,CAAC,CAK7B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,MAAM,CAQR;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,OAAO,KAAK,EACvB,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAiB3D;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,OAAO,SAAS,EAC/B,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CA4G3D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Synced from packages/transport-realtime/src/runtime-events.ts
|
|
2
2
|
// Extracted from legacy source: src/runtime/transports/runtime-events-client.ts
|
|
3
3
|
import { RUNTIME_EVENT_DOMAINS } from '../contracts/index.js';
|
|
4
|
-
import { normalizeAuthToken, openRawServerSentEventStream as openServerSentEventStream } from '../transport-http/index.js';
|
|
4
|
+
import { normalizeAuthToken, openRawServerSentEventStream as openServerSentEventStream, normalizeStreamReconnectPolicy, getStreamReconnectDelay, } from '../transport-http/index.js';
|
|
5
5
|
import { buildUrl, normalizeBaseUrl } from '../transport-http/index.js';
|
|
6
6
|
import { createRemoteDomainEvents, } from './domain-events.js';
|
|
7
7
|
/**
|
|
@@ -31,6 +31,10 @@ import { createRemoteDomainEvents, } from './domain-events.js';
|
|
|
31
31
|
* });
|
|
32
32
|
*/
|
|
33
33
|
export { forSession as forSessionRuntime } from './domain-events.js';
|
|
34
|
+
/** Default max reconnect attempts for WebSocket connections (finite to prevent infinite auth loops). */
|
|
35
|
+
export const DEFAULT_WS_MAX_ATTEMPTS = 10;
|
|
36
|
+
/** Maximum number of messages that may be queued in outboundQueue pending a producer API. */
|
|
37
|
+
const MAX_OUTBOUND_QUEUE = 256;
|
|
34
38
|
export function createRemoteRuntimeEvents(connect) {
|
|
35
39
|
return createRemoteDomainEvents(RUNTIME_EVENT_DOMAINS, connect);
|
|
36
40
|
}
|
|
@@ -73,10 +77,20 @@ export function createWebSocketConnector(baseUrl, token, WebSocketImpl, options
|
|
|
73
77
|
const url = buildWebSocketUrl(baseUrl, [domain]);
|
|
74
78
|
const reconnect = options.reconnect;
|
|
75
79
|
const enabled = reconnect?.enabled ?? false;
|
|
80
|
+
// Normalize reconnect policy, defaulting maxAttempts to a finite value to prevent
|
|
81
|
+
// infinite auth-failure loops. Callers can opt-in to a higher limit explicitly.
|
|
82
|
+
const reconnectPolicy = normalizeStreamReconnectPolicy({
|
|
83
|
+
...reconnect,
|
|
84
|
+
maxAttempts: reconnect?.maxAttempts ?? DEFAULT_WS_MAX_ATTEMPTS,
|
|
85
|
+
});
|
|
76
86
|
let stopped = false;
|
|
77
87
|
let reconnectAttempt = 0;
|
|
88
|
+
let hasReceivedMessage = false;
|
|
78
89
|
let socket = null;
|
|
79
90
|
let reconnectTimer = null;
|
|
91
|
+
// TODO: producer API not yet wired. When added, bound queue size via
|
|
92
|
+
// MAX_OUTBOUND_QUEUE (see below) and drop oldest or reject with onError.
|
|
93
|
+
const outboundQueue = [];
|
|
80
94
|
const closeSocket = () => {
|
|
81
95
|
if (!socket)
|
|
82
96
|
return;
|
|
@@ -91,34 +105,43 @@ export function createWebSocketConnector(baseUrl, token, WebSocketImpl, options
|
|
|
91
105
|
if (!enabled || stopped)
|
|
92
106
|
return;
|
|
93
107
|
const nextAttempt = reconnectAttempt + 1;
|
|
94
|
-
|
|
95
|
-
if (nextAttempt >= maxAttempts)
|
|
108
|
+
if (nextAttempt >= reconnectPolicy.maxAttempts)
|
|
96
109
|
return;
|
|
97
110
|
reconnectAttempt = nextAttempt;
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
const backoffFactor = reconnect?.backoffFactor ?? 2;
|
|
101
|
-
const delayMs = Math.min(maxDelayMs, Math.floor(baseDelayMs * (backoffFactor ** Math.max(0, nextAttempt - 1))));
|
|
111
|
+
// Use shared backoff helper so WS and SSE are on identical schedule.
|
|
112
|
+
const delayMs = getStreamReconnectDelay(nextAttempt, reconnectPolicy);
|
|
102
113
|
reconnectTimer = setTimeout(() => {
|
|
103
114
|
reconnectTimer = null;
|
|
104
115
|
void connect();
|
|
105
116
|
}, delayMs);
|
|
106
117
|
};
|
|
118
|
+
const flushOutboundQueue = (ws) => {
|
|
119
|
+
while (outboundQueue.length > 0) {
|
|
120
|
+
ws.send(outboundQueue.shift());
|
|
121
|
+
}
|
|
122
|
+
};
|
|
107
123
|
const onOpen = async () => {
|
|
108
|
-
reconnectAttempt = 0;
|
|
109
124
|
const authToken = (await normalizeAuthToken(token ?? undefined)()) ?? null;
|
|
110
125
|
if (!authToken || !socket)
|
|
111
126
|
return;
|
|
127
|
+
// Send auth frame first, then drain any messages buffered during resolution.
|
|
112
128
|
socket.send(JSON.stringify({
|
|
113
129
|
type: 'auth',
|
|
114
130
|
token: authToken,
|
|
115
131
|
domains: [domain],
|
|
116
132
|
}));
|
|
133
|
+
flushOutboundQueue(socket);
|
|
117
134
|
};
|
|
118
135
|
const onMessage = (event) => {
|
|
119
136
|
try {
|
|
120
137
|
const frame = JSON.parse(event.data);
|
|
121
138
|
if (frame.type === 'event' && frame.event === domain && frame.payload && typeof frame.payload === 'object') {
|
|
139
|
+
// Reset reconnect counter on first successful message — transient mid-session
|
|
140
|
+
// failures should not compound with failures from the initial connection phase.
|
|
141
|
+
if (!hasReceivedMessage) {
|
|
142
|
+
hasReceivedMessage = true;
|
|
143
|
+
reconnectAttempt = 0;
|
|
144
|
+
}
|
|
122
145
|
onEnvelope(frame.payload);
|
|
123
146
|
}
|
|
124
147
|
}
|
|
@@ -127,6 +150,7 @@ export function createWebSocketConnector(baseUrl, token, WebSocketImpl, options
|
|
|
127
150
|
}
|
|
128
151
|
};
|
|
129
152
|
const onClose = () => {
|
|
153
|
+
hasReceivedMessage = false;
|
|
130
154
|
closeSocket();
|
|
131
155
|
scheduleReconnect();
|
|
132
156
|
};
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { OperatorMethodInput, OperatorMethodOutput } from './_internal/contracts/index.js';
|
|
2
2
|
import type { AuthTokenResolver } from './_internal/transport-http/index.js';
|
|
3
3
|
import type { OperatorSdk } from './_internal/operator/index.js';
|
|
4
|
-
|
|
4
|
+
import { PermissionResolver, SessionManager, TokenStore } from './_internal/platform/auth/index.js';
|
|
5
|
+
export { PermissionResolver, SessionManager, TokenStore } from './_internal/platform/auth/index.js';
|
|
5
6
|
export type { OAuthStartState, OAuthTokenPayload } from './_internal/platform/auth/oauth-types.js';
|
|
6
7
|
export type GoodVibesCurrentAuth = OperatorMethodOutput<'control.auth.current'>;
|
|
7
8
|
export type GoodVibesLoginInput = OperatorMethodInput<'control.auth.login'>;
|
|
@@ -23,33 +24,34 @@ export interface GoodVibesAuthLoginOptions {
|
|
|
23
24
|
*
|
|
24
25
|
* This interface aggregates token storage and session management behind a
|
|
25
26
|
* single object for convenience. For focused single-responsibility access,
|
|
26
|
-
* use the split classes
|
|
27
|
-
* - Token persistence
|
|
28
|
-
* - Login / session lifecycle
|
|
29
|
-
* -
|
|
30
|
-
* -
|
|
27
|
+
* use the split classes exposed as readonly getters on this object:
|
|
28
|
+
* - `sdk.auth.tokenStore` — Token persistence (`TokenStore`)
|
|
29
|
+
* - `sdk.auth.sessionManager` — Login / session lifecycle (`SessionManager`)
|
|
30
|
+
* - `sdk.auth.permissionResolver(snapshot)` — Role / scope checks (`PermissionResolver`)
|
|
31
|
+
* - OAuth 2.0 flows: import `OAuthClient` from `@pellux/goodvibes-sdk/oauth` (Node only)
|
|
31
32
|
*/
|
|
32
33
|
export interface GoodVibesAuthClient {
|
|
33
34
|
readonly writable: boolean;
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
/** The underlying `TokenStore`, or null when using a read-only `getAuthToken` resolver. */
|
|
36
|
+
readonly tokenStore: TokenStore | null;
|
|
37
|
+
/** The underlying `SessionManager`, which owns login and current-auth delegation. */
|
|
38
|
+
readonly sessionManager: SessionManager;
|
|
36
39
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
+
* Build a `PermissionResolver` from a live auth snapshot.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const snap = await sdk.auth.current();
|
|
44
|
+
* const perm = sdk.auth.permissionResolver(snap);
|
|
45
|
+
* if (perm.hasRole('admin')) { ... }
|
|
40
46
|
*/
|
|
47
|
+
permissionResolver(snapshot: GoodVibesCurrentAuth): PermissionResolver;
|
|
48
|
+
current(): Promise<GoodVibesCurrentAuth>;
|
|
49
|
+
login(input: GoodVibesLoginInput, options?: GoodVibesAuthLoginOptions): Promise<GoodVibesLoginOutput>;
|
|
50
|
+
/** Retrieve the current token. Delegates to `TokenStore.getToken()`. */
|
|
41
51
|
getToken(): Promise<string | null>;
|
|
42
|
-
/**
|
|
43
|
-
* @deprecated Prefer `TokenStore.setToken()` for direct token mutation.
|
|
44
|
-
* `GoodVibesAuthClient.setToken()` remains supported and delegates to the
|
|
45
|
-
* same underlying store.
|
|
46
|
-
*/
|
|
52
|
+
/** Persist a token. Delegates to `TokenStore.setToken()`. */
|
|
47
53
|
setToken(token: string | null): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* @deprecated Prefer `TokenStore.clearToken()` for direct token mutation.
|
|
50
|
-
* `GoodVibesAuthClient.clearToken()` remains supported and delegates to the
|
|
51
|
-
* same underlying store.
|
|
52
|
-
*/
|
|
54
|
+
/** Clear the stored token. Delegates to `TokenStore.clearToken()`. */
|
|
53
55
|
clearToken(): Promise<void>;
|
|
54
56
|
}
|
|
55
57
|
/**
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,oCAAoC,CAAC;AAQ5C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACpG,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAEnG,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;AAChF,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;AAC5E,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;;OAOG;IACH,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,kBAAkB,CAAC;IACvE,OAAO,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzC,KAAK,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtG,wEAAwE;IACxE,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,sEAAsE;IACtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,mBAAmB,CAa9F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,mBAAmB,CAmBnG;AAwBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,mBAAmB,GAAG,IAAI,EACtC,YAAY,CAAC,EAAE,iBAAiB,GAC/B,mBAAmB,CAyCrB"}
|
package/dist/auth.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ConfigurationError } from './_internal/errors/index.js';
|
|
2
|
+
import { PermissionResolver, SessionManager, TokenStore, } from './_internal/platform/auth/index.js';
|
|
2
3
|
// Re-export focused responsibility classes for consumers who prefer
|
|
3
4
|
// narrower, single-concern APIs over the combined GoodVibesAuthClient facade.
|
|
4
5
|
// NOTE: OAuthClient is intentionally NOT re-exported here. It depends on
|
|
5
6
|
// node:crypto and is not safe in React Native / browser bundles.
|
|
6
7
|
// Use @pellux/goodvibes-sdk/oauth for Node.js consumers who need OAuthClient.
|
|
7
|
-
export { PermissionResolver, SessionManager, TokenStore
|
|
8
|
+
export { PermissionResolver, SessionManager, TokenStore } from './_internal/platform/auth/index.js';
|
|
8
9
|
function requireStorage(storage) {
|
|
9
10
|
const resolved = storage ?? globalThis.localStorage;
|
|
10
11
|
if (!resolved) {
|
|
@@ -111,20 +112,34 @@ function assertWritableTokenStore(tokenStore) {
|
|
|
111
112
|
* await sdk.auth.clearToken();
|
|
112
113
|
*/
|
|
113
114
|
export function createGoodVibesAuthClient(operator, tokenStore, getAuthToken) {
|
|
115
|
+
// Construct the split-class instances that own each concern.
|
|
116
|
+
// The facade delegates to these rather than duplicating logic.
|
|
117
|
+
const ts = tokenStore ? new TokenStore(tokenStore) : null;
|
|
118
|
+
const sm = new SessionManager(operator, ts);
|
|
114
119
|
return {
|
|
115
|
-
writable
|
|
120
|
+
get writable() {
|
|
121
|
+
return sm.writable;
|
|
122
|
+
},
|
|
123
|
+
get tokenStore() {
|
|
124
|
+
return ts;
|
|
125
|
+
},
|
|
126
|
+
get sessionManager() {
|
|
127
|
+
return sm;
|
|
128
|
+
},
|
|
129
|
+
permissionResolver(snapshot) {
|
|
130
|
+
return new PermissionResolver(snapshot);
|
|
131
|
+
},
|
|
116
132
|
async current() {
|
|
117
|
-
return
|
|
133
|
+
return sm.current();
|
|
118
134
|
},
|
|
119
135
|
async login(input, options = {}) {
|
|
120
|
-
|
|
121
|
-
if ((options.persistToken ?? true) && tokenStore) {
|
|
122
|
-
await tokenStore.setToken(result.token);
|
|
123
|
-
}
|
|
124
|
-
return result;
|
|
136
|
+
return sm.login(input, options);
|
|
125
137
|
},
|
|
126
138
|
async getToken() {
|
|
127
|
-
|
|
139
|
+
if (ts) {
|
|
140
|
+
return ts.getToken();
|
|
141
|
+
}
|
|
142
|
+
return await readToken(null, getAuthToken);
|
|
128
143
|
},
|
|
129
144
|
async setToken(token) {
|
|
130
145
|
await assertWritableTokenStore(tokenStore).setToken(token);
|