@astroway/sdk 0.1.0-alpha.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +350 -0
  2. package/README.md +59 -31
  3. package/dist/cache.d.ts +101 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +198 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/errors.d.ts +30 -6
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +45 -14
  10. package/dist/errors.js.map +1 -1
  11. package/dist/helpers/birth-date-time.d.ts +76 -0
  12. package/dist/helpers/birth-date-time.d.ts.map +1 -0
  13. package/dist/helpers/birth-date-time.js +112 -0
  14. package/dist/helpers/birth-date-time.js.map +1 -0
  15. package/dist/helpers/index.d.ts +3 -0
  16. package/dist/helpers/index.d.ts.map +1 -0
  17. package/dist/helpers/index.js +3 -0
  18. package/dist/helpers/index.js.map +1 -0
  19. package/dist/idempotency.d.ts +10 -0
  20. package/dist/idempotency.d.ts.map +1 -0
  21. package/dist/idempotency.js +41 -0
  22. package/dist/idempotency.js.map +1 -0
  23. package/dist/index.d.ts +97 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +191 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/namespaces.generated.d.ts +1513 -0
  28. package/dist/namespaces.generated.d.ts.map +1 -0
  29. package/dist/namespaces.generated.js +865 -0
  30. package/dist/namespaces.generated.js.map +1 -0
  31. package/dist/runtime.d.ts +7 -0
  32. package/dist/runtime.d.ts.map +1 -0
  33. package/dist/runtime.js +31 -0
  34. package/dist/runtime.js.map +1 -0
  35. package/dist/stream.d.ts +71 -0
  36. package/dist/stream.d.ts.map +1 -0
  37. package/dist/stream.js +199 -0
  38. package/dist/stream.js.map +1 -0
  39. package/dist/testing.d.ts +133 -0
  40. package/dist/testing.d.ts.map +1 -0
  41. package/dist/testing.js +132 -0
  42. package/dist/testing.js.map +1 -0
  43. package/dist/types.generated.d.ts +784 -176
  44. package/dist/types.generated.d.ts.map +1 -1
  45. package/dist/version.d.ts +1 -1
  46. package/dist/version.d.ts.map +1 -1
  47. package/dist/version.js +1 -1
  48. package/dist/version.js.map +1 -1
  49. package/dist/with-response.d.ts +36 -0
  50. package/dist/with-response.d.ts.map +1 -0
  51. package/dist/with-response.js +38 -0
  52. package/dist/with-response.js.map +1 -0
  53. package/package.json +19 -3
@@ -0,0 +1,41 @@
1
+ /** Idempotency key generation + policy. */
2
+ const HEX = '0123456789abcdef';
3
+ /** RFC 4122 v4 UUID. Uses Web Crypto when available, falls back to Math.random. */
4
+ export function generateIdempotencyKey() {
5
+ const c = globalThis.crypto;
6
+ if (c?.randomUUID) {
7
+ return c.randomUUID();
8
+ }
9
+ const bytes = new Uint8Array(16);
10
+ if (c?.getRandomValues) {
11
+ c.getRandomValues(bytes);
12
+ }
13
+ else {
14
+ for (let i = 0; i < 16; i++)
15
+ bytes[i] = Math.floor(Math.random() * 256);
16
+ }
17
+ // RFC 4122 v4: set version (bits 12-15 of clock_seq_hi_and_reserved → 0100)
18
+ // and variant (bits 6-7 of clock_seq_hi_and_reserved → 10).
19
+ bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;
20
+ bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;
21
+ let hex = '';
22
+ for (let i = 0; i < 16; i++) {
23
+ const b = bytes[i] ?? 0;
24
+ hex += HEX[(b >> 4) & 0xf];
25
+ hex += HEX[b & 0xf];
26
+ }
27
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
28
+ }
29
+ /** True for the methods we auto-attach an idempotency key on (POST only). */
30
+ export function shouldAttachIdempotency(mode, method) {
31
+ if (mode === 'off')
32
+ return false;
33
+ return method.toUpperCase() === 'POST';
34
+ }
35
+ export function resolveKeyGenerator(mode) {
36
+ if (typeof mode === 'object' && mode !== null && typeof mode.generator === 'function') {
37
+ return mode.generator;
38
+ }
39
+ return generateIdempotencyKey;
40
+ }
41
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAO3C,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAE/B,mFAAmF;AACnF,MAAM,UAAU,sBAAsB;IACpC,MAAM,CAAC,GAAG,UAAU,CAAC,MAA4B,CAAC;IAClD,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;QACvB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,4EAA4E;IAC5E,4DAA4D;IAC5D,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC3B,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,IAAiC,EAAE,MAAc;IACvF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiC;IACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -14,8 +14,19 @@
14
14
  import createClient from 'openapi-fetch';
15
15
  import type { paths } from './types.generated.js';
16
16
  import { type RetryOptions } from './retry.js';
17
+ import { type AstrowayNamespaces } from './namespaces.generated.js';
18
+ import { type IdempotencyMode } from './idempotency.js';
19
+ import { type StreamChunk } from './stream.js';
20
+ import { type CacheOption, type ResolvedCache } from './cache.js';
17
21
  export * from './errors.js';
18
22
  export type { paths, components, operations } from './types.generated.js';
23
+ export type { AstrowayNamespaces, CallOptions } from './namespaces.generated.js';
24
+ export type { IdempotencyMode } from './idempotency.js';
25
+ export { generateIdempotencyKey } from './idempotency.js';
26
+ export { ResultPromise, type WithResponseResult } from './with-response.js';
27
+ export { detectRuntime, type RuntimeInfo } from './runtime.js';
28
+ export { parseSSEStream, normaliseStreamChunk, type SSEEvent, type StreamChunk, } from './stream.js';
29
+ export { buildCacheKey, canonicalise, CACHE_KEY_PREFIX, type CacheEntry, type CacheOption, type CacheStore, DEFAULT_CACHE_TTL_MS, DETERMINISTIC_PATH_PREFIXES, isDeterministicPath, LocalStorageStore, MemoryStore, NON_DETERMINISTIC_PATH_PREFIXES, } from './cache.js';
19
30
  export interface AstrowayOptions {
20
31
  /** API key — `aw_live_...` for production, `aw_test_...` for sandbox. Required. */
21
32
  apiKey: string;
@@ -23,14 +34,53 @@ export interface AstrowayOptions {
23
34
  baseUrl?: string;
24
35
  /** Auth scheme. `header` (default) sends `X-Api-Key: <key>`. `bearer` sends `Authorization: Bearer <key>`. */
25
36
  authScheme?: 'header' | 'bearer';
26
- /** Per-request timeout in ms. Default 30_000. */
37
+ /** Per-request timeout in ms. Default 30_000 for calc endpoints, 120_000 for AI/streaming. */
27
38
  timeoutMs?: number;
28
39
  /** Retry configuration. Default 2 retries, exp backoff, on 408/409/429/5xx/connection. Set `{ maxRetries: 0 }` to disable. */
29
40
  retry?: RetryOptions;
30
41
  /** Optional custom `fetch` implementation. Default — global `fetch`. */
31
42
  fetch?: typeof globalThis.fetch;
43
+ /**
44
+ * Undici `Agent` / `Pool` / `MockAgent` for connection pooling, custom proxy,
45
+ * mTLS, etc. Node-only — silently ignored on browser, edge runtimes, Bun, Deno.
46
+ *
47
+ * Example (heavy batching):
48
+ * ```ts
49
+ * import { Agent } from 'undici';
50
+ * const dispatcher = new Agent({ keepAliveTimeout: 60_000, connections: 50 });
51
+ * const aw = new Astroway({ apiKey, dispatcher });
52
+ * ```
53
+ */
54
+ dispatcher?: unknown;
32
55
  /** Extra headers added to every request. */
33
56
  defaultHeaders?: Record<string, string>;
57
+ /**
58
+ * Idempotency key policy for credit-costing POSTs.
59
+ * - `'auto'` (default): every POST gets a fresh UUIDv4 `Idempotency-Key` header
60
+ * unless the caller already supplied one.
61
+ * - `'off'`: never auto-generate. Caller controls the header explicitly.
62
+ * - `{ generator }`: provide your own key source (deterministic test keys, ULIDs, etc).
63
+ *
64
+ * Backend-coordinated: server still works without it, so old SDKs won't break.
65
+ * Recommended to keep `'auto'` so a network blip retry never double-bills.
66
+ */
67
+ idempotency?: IdempotencyMode;
68
+ /**
69
+ * Client-side response cache for deterministic endpoints (charts, synastry,
70
+ * vedic, numerology, tarot, hd, dasha). Set to:
71
+ *
72
+ * - `false` / unset (default) — no cache.
73
+ * - `'memory'` — in-process Map, fast for tests and short-lived processes.
74
+ * - `'localStorage'` — browser/edge-runtime `Storage` adapter.
75
+ * - a `CacheStore` — bring-your-own (Redis, IndexedDB, etc.).
76
+ * - `{ store, ttlMs }` — store + custom default TTL.
77
+ *
78
+ * Time-sensitive endpoints (`/transits`, `/horoscope`, `/interpret`, `/ai/*`,
79
+ * `/mcp/*`, `/stream/*`, `/now`, `/today`) are skipped by default. Force
80
+ * per-call via the `Idempotency-Key` `x-astroway-cache: yes|no` header
81
+ * pattern (advanced; usually unnecessary).
82
+ */
83
+ cache?: CacheOption;
34
84
  }
35
85
  /**
36
86
  * Type-safe AstroWay client. Methods (`GET`, `POST`, `PUT`, `DELETE`) and
@@ -44,14 +94,59 @@ export type AstrowayClient = ReturnType<typeof createClient<paths>>;
44
94
  * users who prefer the factory style.
45
95
  */
46
96
  export declare function createAstroway(options: AstrowayOptions): AstrowayClient;
97
+ /**
98
+ * Type-safe AstroWay client. Use the typed namespaces for IDE autocomplete
99
+ * (`aw.synastry.aspectGrid({...})`) — they wrap the underlying openapi-fetch
100
+ * `client` and unwrap the `{ ok, data, error }` envelope, returning `data`
101
+ * directly. Errors throw classified subclasses of `ApiError`.
102
+ *
103
+ * The raw `client` (`aw.client.POST(...)`) and `aw.request(...)` remain
104
+ * available as escape hatches when you need the full envelope or want to call
105
+ * an endpoint not yet covered by namespaces.
106
+ */
107
+ export interface Astroway extends AstrowayNamespaces {
108
+ }
47
109
  export declare class Astroway {
48
110
  /** The underlying typed openapi-fetch client. */
49
111
  readonly client: AstrowayClient;
50
- readonly options: Required<Omit<AstrowayOptions, 'fetch' | 'defaultHeaders' | 'retry'>> & {
112
+ readonly options: Required<Omit<AstrowayOptions, 'fetch' | 'defaultHeaders' | 'retry' | 'cache' | 'dispatcher'>> & {
51
113
  fetch: typeof globalThis.fetch;
52
114
  defaultHeaders: Record<string, string>;
53
115
  retry: RetryOptions;
116
+ cache: ResolvedCache | null;
117
+ dispatcher: unknown;
54
118
  };
55
119
  constructor(options: AstrowayOptions);
120
+ /**
121
+ * Open a Server-Sent Events stream against an SSE-capable endpoint
122
+ * (`/horoscope/daily`, `/interpret/*`, `/mcp/streaming`, etc.). Returns an
123
+ * async iterable of normalised {@link StreamChunk}s — the user can `for await`
124
+ * over it the same way they would Anthropic's `MessageStream`:
125
+ *
126
+ * ```ts
127
+ * for await (const chunk of aw.streamSSE('/horoscope/daily', { date: '2026-05-10' })) {
128
+ * if (chunk.type === 'text_delta') process.stdout.write(chunk.text);
129
+ * if (chunk.type === 'done') break;
130
+ * if (chunk.type === 'error') throw new Error(chunk.message);
131
+ * }
132
+ * ```
133
+ *
134
+ * The same auth/User-Agent/timeout/retry policy as regular calls applies.
135
+ * Idempotency-Key auto-attaches on POST so a network blip + reconnect on the
136
+ * same key replays the same generation deterministically (when the backend
137
+ * supports it; fails open otherwise).
138
+ *
139
+ * Named `streamSSE` rather than `stream` because `/stream/*` is already a
140
+ * namespace for synchronous calc endpoints (`stream.positions`, `stream.ingress`,
141
+ * etc.).
142
+ *
143
+ * AbortSignal is honoured — pass `options.signal` to cancel the stream
144
+ * mid-flight.
145
+ */
146
+ streamSSE(path: string, body?: unknown, options?: {
147
+ method?: 'POST' | 'GET';
148
+ signal?: AbortSignal;
149
+ idempotencyKey?: string;
150
+ }): AsyncGenerator<StreamChunk, void, void>;
56
151
  }
57
152
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,YAAoC,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAOlD,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/D,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8HAA8H;IAC9H,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAEvE;AAED,qBAAa,QAAQ;IACnB,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG;QACxF,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,KAAK,EAAE,YAAY,CAAC;KACrB,CAAC;gBAEU,OAAO,EAAE,eAAe;CAkErC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,8 +15,25 @@ import createClient from 'openapi-fetch';
15
15
  import { ApiError, APIConnectionError, APITimeoutError, classifyHttpError, } from './errors.js';
16
16
  import { fetchWithRetry } from './retry.js';
17
17
  import { SDK_VERSION } from './version.js';
18
+ import { detectRuntime } from './runtime.js';
19
+ import { buildNamespaces } from './namespaces.generated.js';
20
+ import { resolveKeyGenerator, shouldAttachIdempotency, } from './idempotency.js';
21
+ import { streamFromResponse } from './stream.js';
22
+ import { buildCacheKey, isDeterministicPath, resolveCacheOption, } from './cache.js';
18
23
  export * from './errors.js';
24
+ export { generateIdempotencyKey } from './idempotency.js';
25
+ export { ResultPromise } from './with-response.js';
26
+ export { detectRuntime } from './runtime.js';
27
+ export { parseSSEStream, normaliseStreamChunk, } from './stream.js';
28
+ export { buildCacheKey, canonicalise, CACHE_KEY_PREFIX, DEFAULT_CACHE_TTL_MS, DETERMINISTIC_PATH_PREFIXES, isDeterministicPath, LocalStorageStore, MemoryStore, NON_DETERMINISTIC_PATH_PREFIXES, } from './cache.js';
19
29
  const DEFAULT_BASE_URL = 'https://api.astroway.info/v1';
30
+ /** Default timeout for long-running paths (AI gateway, SSE) when caller hasn't set `timeoutMs`. */
31
+ const LONG_RUNNING_TIMEOUT_MS = 120_000;
32
+ /** Path prefixes that warrant a longer default timeout — AI gateway routes through `ai.astroway.info`. */
33
+ const LONG_RUNNING_PATH_PREFIXES = ['/ai/', '/horoscope/', '/interpret/', '/mcp/streaming', '/stream/'];
34
+ function isLongRunningPath(path) {
35
+ return LONG_RUNNING_PATH_PREFIXES.some((p) => path === p.replace(/\/$/, '') || path.startsWith(p));
36
+ }
20
37
  /**
21
38
  * Creates a new AstroWay client. Equivalent to `new Astroway(...)` for
22
39
  * users who prefer the factory style.
@@ -38,6 +55,10 @@ export class Astroway {
38
55
  const retry = options.retry ?? {};
39
56
  const fetchImpl = options.fetch ?? globalThis.fetch;
40
57
  const defaultHeaders = options.defaultHeaders ?? {};
58
+ const idempotency = options.idempotency ?? 'auto';
59
+ const generateKey = resolveKeyGenerator(idempotency);
60
+ const dispatcher = options.dispatcher;
61
+ const cache = resolveCacheOption(options.cache);
41
62
  this.options = {
42
63
  apiKey: options.apiKey,
43
64
  baseUrl,
@@ -46,11 +67,15 @@ export class Astroway {
46
67
  retry,
47
68
  fetch: fetchImpl,
48
69
  defaultHeaders,
70
+ idempotency,
71
+ cache,
72
+ dispatcher,
49
73
  };
50
74
  const authHeaders = authScheme === 'bearer'
51
75
  ? { Authorization: `Bearer ${options.apiKey}` }
52
76
  : { 'X-Api-Key': options.apiKey };
53
- const userAgent = `astroway-sdk-typescript/${SDK_VERSION} (Node/${typeof process !== 'undefined' ? process.versions.node : 'unknown'})`;
77
+ const runtime = detectRuntime();
78
+ const userAgent = `astroway-sdk-typescript/${SDK_VERSION} (${runtime.name}/${runtime.version})`;
54
79
  const clientOpts = {
55
80
  baseUrl,
56
81
  headers: {
@@ -60,19 +85,88 @@ export class Astroway {
60
85
  ...defaultHeaders,
61
86
  },
62
87
  fetch: async (input) => {
88
+ // Cache lookup pre-flight: deterministic GET/POST against cacheable
89
+ // endpoints short-circuit with a synthetic Response built from the
90
+ // stored payload. The body is consumed once (clone() + .json()) and
91
+ // re-attached to a fresh Request so downstream `fetch` still works.
92
+ const cachePath = pathFromUrl(input.url, baseUrl);
93
+ let cacheKey = null;
94
+ if (cache && (input.method === 'GET' || input.method === 'POST') && isDeterministicPath(cachePath)) {
95
+ let bodyForKey = null;
96
+ if (input.method === 'POST') {
97
+ try {
98
+ const cloned = input.clone();
99
+ const txt = await cloned.text();
100
+ bodyForKey = txt === '' ? null : JSON.parse(txt);
101
+ }
102
+ catch { /* non-JSON body, hash the raw URL only */ }
103
+ }
104
+ cacheKey = await buildCacheKey(input.method, cachePath, bodyForKey);
105
+ const hit = await cache.store.get(cacheKey);
106
+ if (hit && hit.expiresAt > Date.now()) {
107
+ return new Response(JSON.stringify(hit.value), {
108
+ status: 200,
109
+ headers: {
110
+ 'content-type': 'application/json',
111
+ 'x-astroway-cache': 'hit',
112
+ },
113
+ });
114
+ }
115
+ }
116
+ // Auto-attach Idempotency-Key on POSTs unless caller already supplied one or
117
+ // the policy is disabled. We clone the request rather than mutating headers
118
+ // since the runtime Request object can be frozen in some environments.
119
+ if (shouldAttachIdempotency(idempotency, input.method)
120
+ && !input.headers.has('idempotency-key')) {
121
+ const headers = new Headers(input.headers);
122
+ headers.set('Idempotency-Key', generateKey());
123
+ input = new Request(input, { headers });
124
+ }
125
+ // Per-call timeout override travels via x-astroway-timeout-ms header set
126
+ // by the namespace wrapper. Strip before sending so the server never sees
127
+ // it; longest path-based default kicks in for long-running AI/SSE routes.
128
+ let effectiveTimeoutMs = timeoutMs;
129
+ if (input.headers.has('x-astroway-timeout-ms')) {
130
+ const raw = Number(input.headers.get('x-astroway-timeout-ms'));
131
+ if (Number.isFinite(raw) && raw > 0)
132
+ effectiveTimeoutMs = raw;
133
+ const headers = new Headers(input.headers);
134
+ headers.delete('x-astroway-timeout-ms');
135
+ input = new Request(input, { headers });
136
+ }
137
+ else if (options.timeoutMs === undefined
138
+ && isLongRunningPath(pathFromUrl(input.url, baseUrl))) {
139
+ effectiveTimeoutMs = LONG_RUNNING_TIMEOUT_MS;
140
+ }
63
141
  const controller = new AbortController();
64
- const timer = setTimeout(() => controller.abort(), timeoutMs);
142
+ const timer = setTimeout(() => controller.abort(), effectiveTimeoutMs);
65
143
  const reqInit = { signal: controller.signal };
144
+ if (dispatcher !== undefined)
145
+ reqInit.dispatcher = dispatcher;
66
146
  try {
67
147
  const res = await fetchWithRetry(() => fetchImpl(input, reqInit), retry);
68
148
  await throwOnApiError(res);
149
+ if (cache && cacheKey && res.ok) {
150
+ // Cache the full parsed payload — openapi-fetch surfaces it as-is
151
+ // through `result.data`, so the cached hit must round-trip identical bytes.
152
+ try {
153
+ const cloned = res.clone();
154
+ const txt = await cloned.text();
155
+ const parsed = JSON.parse(txt);
156
+ await cache.store.set(cacheKey, {
157
+ expiresAt: Date.now() + cache.defaultTtlMs,
158
+ value: parsed,
159
+ });
160
+ }
161
+ catch { /* non-JSON success body — skip cache */ }
162
+ }
69
163
  return res;
70
164
  }
71
165
  catch (e) {
72
166
  if (e instanceof ApiError)
73
167
  throw e;
74
168
  if (e?.name === 'AbortError') {
75
- throw new APITimeoutError(`Request to ${input.url} timed out after ${timeoutMs}ms`, { cause: e });
169
+ throw new APITimeoutError(`Request to ${input.url} timed out after ${effectiveTimeoutMs}ms`, { cause: e });
76
170
  }
77
171
  throw new APIConnectionError(`Network error calling ${input.url}: ${e?.message ?? 'unknown'}. Check your connection or baseUrl.`, { cause: e });
78
172
  }
@@ -82,6 +176,97 @@ export class Astroway {
82
176
  },
83
177
  };
84
178
  this.client = createClient(clientOpts);
179
+ Object.assign(this, buildNamespaces(this.client));
180
+ }
181
+ /**
182
+ * Open a Server-Sent Events stream against an SSE-capable endpoint
183
+ * (`/horoscope/daily`, `/interpret/*`, `/mcp/streaming`, etc.). Returns an
184
+ * async iterable of normalised {@link StreamChunk}s — the user can `for await`
185
+ * over it the same way they would Anthropic's `MessageStream`:
186
+ *
187
+ * ```ts
188
+ * for await (const chunk of aw.streamSSE('/horoscope/daily', { date: '2026-05-10' })) {
189
+ * if (chunk.type === 'text_delta') process.stdout.write(chunk.text);
190
+ * if (chunk.type === 'done') break;
191
+ * if (chunk.type === 'error') throw new Error(chunk.message);
192
+ * }
193
+ * ```
194
+ *
195
+ * The same auth/User-Agent/timeout/retry policy as regular calls applies.
196
+ * Idempotency-Key auto-attaches on POST so a network blip + reconnect on the
197
+ * same key replays the same generation deterministically (when the backend
198
+ * supports it; fails open otherwise).
199
+ *
200
+ * Named `streamSSE` rather than `stream` because `/stream/*` is already a
201
+ * namespace for synchronous calc endpoints (`stream.positions`, `stream.ingress`,
202
+ * etc.).
203
+ *
204
+ * AbortSignal is honoured — pass `options.signal` to cancel the stream
205
+ * mid-flight.
206
+ */
207
+ async *streamSSE(path, body, options) {
208
+ const method = options?.method ?? 'POST';
209
+ const url = `${this.options.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
210
+ const headers = {
211
+ ...(this.options.authScheme === 'bearer'
212
+ ? { Authorization: `Bearer ${this.options.apiKey}` }
213
+ : { 'X-Api-Key': this.options.apiKey }),
214
+ Accept: 'text/event-stream',
215
+ 'X-Astroway-Channel': 'sdk-ts',
216
+ ...this.options.defaultHeaders,
217
+ };
218
+ if (body !== undefined)
219
+ headers['Content-Type'] = 'application/json';
220
+ // Streaming POSTs benefit from idempotency the same way regular POSTs do —
221
+ // a reconnect retries the *same* generation, the server returns it, no double-bill.
222
+ if (method === 'POST') {
223
+ if (options?.idempotencyKey) {
224
+ headers['Idempotency-Key'] = options.idempotencyKey;
225
+ }
226
+ else if (shouldAttachIdempotency(this.options.idempotency, method)) {
227
+ headers['Idempotency-Key'] = resolveKeyGenerator(this.options.idempotency)();
228
+ }
229
+ }
230
+ const fetchImpl = this.options.fetch;
231
+ const init = {
232
+ method,
233
+ headers,
234
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
235
+ ...(options?.signal ? { signal: options.signal } : {}),
236
+ };
237
+ let response;
238
+ try {
239
+ response = await fetchImpl(url, init);
240
+ }
241
+ catch (e) {
242
+ if (e?.name === 'AbortError') {
243
+ throw new APITimeoutError(`Stream to ${path} aborted`, { cause: e });
244
+ }
245
+ throw new APIConnectionError(`Network error opening stream to ${path}: ${e?.message ?? 'unknown'}`, { cause: e });
246
+ }
247
+ yield* streamFromResponse(response);
248
+ }
249
+ }
250
+ /**
251
+ * Strip the configured baseUrl prefix from a request URL so that the cache
252
+ * key path matches what `isDeterministicPath` expects (`/chart`, not
253
+ * `https://api.astroway.info/v1/chart`). Falls back gracefully on URLs that
254
+ * don't share the baseUrl.
255
+ */
256
+ function pathFromUrl(url, baseUrl) {
257
+ try {
258
+ const u = new URL(url);
259
+ const b = new URL(baseUrl);
260
+ if (u.origin !== b.origin)
261
+ return u.pathname + u.search;
262
+ let path = u.pathname;
263
+ const basePath = b.pathname.replace(/\/$/, '');
264
+ if (basePath && path.startsWith(basePath))
265
+ path = path.slice(basePath.length) || '/';
266
+ return path + u.search;
267
+ }
268
+ catch {
269
+ return url;
85
270
  }
86
271
  }
87
272
  /**
@@ -95,6 +280,8 @@ async function throwOnApiError(res) {
95
280
  const requestId = res.headers.get('x-request-id') ?? undefined;
96
281
  const retryAfter = res.headers.get('retry-after');
97
282
  const retryAfterSeconds = retryAfter && !Number.isNaN(Number(retryAfter)) ? Number(retryAfter) : undefined;
283
+ const creditsRaw = res.headers.get('x-credits-remaining');
284
+ const creditsRemaining = creditsRaw && !Number.isNaN(Number(creditsRaw)) ? Number(creditsRaw) : undefined;
98
285
  let body;
99
286
  let code;
100
287
  let message = `${res.status} ${res.statusText}`;
@@ -117,6 +304,7 @@ async function throwOnApiError(res) {
117
304
  body,
118
305
  ...(requestId !== undefined ? { requestId } : {}),
119
306
  ...(retryAfterSeconds !== undefined ? { retryAfterSeconds } : {}),
307
+ ...(creditsRemaining !== undefined ? { creditsRemaining } : {}),
120
308
  });
121
309
  }
122
310
  //# 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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}