@expandai/sdk 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -4
- package/build/dts/AppendixMarkers.d.ts +30 -0
- package/build/dts/AppendixMarkers.d.ts.map +1 -0
- package/build/dts/Client.d.ts +41 -6
- package/build/dts/Client.d.ts.map +1 -1
- package/build/dts/Crawls.d.ts +568 -0
- package/build/dts/Crawls.d.ts.map +1 -0
- package/build/dts/EnvProxyHttpClient.d.ts +28 -0
- package/build/dts/EnvProxyHttpClient.d.ts.map +1 -0
- package/build/dts/FetchJson.d.ts +444 -37
- package/build/dts/FetchJson.d.ts.map +1 -1
- package/build/dts/Generated.d.ts +1545 -788
- package/build/dts/Generated.d.ts.map +1 -1
- package/build/dts/HttpClientHelpers.d.ts +13 -0
- package/build/dts/HttpClientHelpers.d.ts.map +1 -1
- package/build/dts/Internal.d.ts +6 -4
- package/build/dts/Internal.d.ts.map +1 -1
- package/build/dts/ParseErrorBody.d.ts +26 -0
- package/build/dts/ParseErrorBody.d.ts.map +1 -0
- package/build/dts/Playground.d.ts +20 -0
- package/build/dts/Playground.d.ts.map +1 -1
- package/build/dts/RetryAfter.d.ts +40 -0
- package/build/dts/RetryAfter.d.ts.map +1 -0
- package/build/dts/Service.d.ts +94 -45
- package/build/dts/Service.d.ts.map +1 -1
- package/build/dts/StreamPage.d.ts +10 -0
- package/build/dts/StreamPage.d.ts.map +1 -0
- package/build/dts/index.d.ts +9 -2
- package/build/dts/index.d.ts.map +1 -1
- package/build/esm/AppendixMarkers.js +307 -0
- package/build/esm/AppendixMarkers.js.map +1 -0
- package/build/esm/Client.js +96 -15
- package/build/esm/Client.js.map +1 -1
- package/build/esm/Crawls.js +786 -0
- package/build/esm/Crawls.js.map +1 -0
- package/build/esm/EnvProxyHttpClient.js +55 -0
- package/build/esm/EnvProxyHttpClient.js.map +1 -0
- package/build/esm/FetchJson.js +48 -22
- package/build/esm/FetchJson.js.map +1 -1
- package/build/esm/Generated.js +540 -112
- package/build/esm/Generated.js.map +1 -1
- package/build/esm/HttpClientHelpers.js +36 -1
- package/build/esm/HttpClientHelpers.js.map +1 -1
- package/build/esm/Internal.js +140 -33
- package/build/esm/Internal.js.map +1 -1
- package/build/esm/ParseErrorBody.js +41 -0
- package/build/esm/ParseErrorBody.js.map +1 -0
- package/build/esm/Playground.js +38 -0
- package/build/esm/Playground.js.map +1 -1
- package/build/esm/RetryAfter.js +104 -0
- package/build/esm/RetryAfter.js.map +1 -0
- package/build/esm/Service.js +96 -17
- package/build/esm/Service.js.map +1 -1
- package/build/esm/StreamPage.js +46 -0
- package/build/esm/StreamPage.js.map +1 -0
- package/build/esm/index.js +5 -1
- package/build/esm/index.js.map +1 -1
- package/package.json +8 -2
- package/src/AppendixMarkers.ts +370 -0
- package/src/Client.ts +131 -16
- package/src/Crawls.ts +1387 -0
- package/src/EnvProxyHttpClient.ts +71 -0
- package/src/FetchJson.ts +63 -25
- package/src/Generated.ts +738 -162
- package/src/HttpClientHelpers.ts +48 -1
- package/src/Internal.ts +163 -105
- package/src/ParseErrorBody.ts +42 -0
- package/src/Playground.ts +48 -0
- package/src/RetryAfter.ts +138 -0
- package/src/Service.ts +208 -25
- package/src/StreamPage.ts +47 -0
- package/src/index.ts +29 -3
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Option, ParseResult, Predicate } from 'effect';
|
|
2
|
+
import { ExpandApiError, ExpandClientApiError } from './Error.js';
|
|
3
|
+
/**
|
|
4
|
+
* The response body a decode failed on.
|
|
5
|
+
*
|
|
6
|
+
* A body that does not satisfy the declared schema arrives as a `ParseError`, which carries none of
|
|
7
|
+
* the body's own fields — not its `_tag`, not its `retryable` verdict, not its `retryAfterSeconds`.
|
|
8
|
+
* Read naively, every one of those looks absent, and absent means "fall back to a client-side
|
|
9
|
+
* guess" at three separate call sites.
|
|
10
|
+
*
|
|
11
|
+
* That is not a hypothetical. This client requires `retryable` on the classes that carry it, so
|
|
12
|
+
* every body from a replica that predates the field fails to decode, and a rolling update runs
|
|
13
|
+
* mixed versions on every deploy. The rejected input survives on the issue, so the fields the
|
|
14
|
+
* server did send are still readable even though the body as a whole was refused.
|
|
15
|
+
*
|
|
16
|
+
* This is deliberately the single place that reaches into a `ParseError` for the body. Each caller
|
|
17
|
+
* that grew its own copy of the check ended up covering a different subset of the fields.
|
|
18
|
+
*/
|
|
19
|
+
export function parseErrorBody(error) {
|
|
20
|
+
if (!ParseResult.isParseError(error))
|
|
21
|
+
return Option.none();
|
|
22
|
+
const actual = error.issue.actual;
|
|
23
|
+
return typeof actual === 'object' && actual !== null ? Option.some(actual) : Option.none();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A field read off either a decoded error or the raw body of an undecodable one.
|
|
27
|
+
*
|
|
28
|
+
* The decoded case is just the property; the fallback is what keeps a server's own answer
|
|
29
|
+
* authoritative when this client rejected the envelope around it.
|
|
30
|
+
*/
|
|
31
|
+
export function errorField(error, key, refine) {
|
|
32
|
+
const read = (source) => Predicate.hasProperty(source, key) && refine(source[key]) ? Option.some(source[key]) : Option.none();
|
|
33
|
+
return Option.orElse(read(error), () => {
|
|
34
|
+
if (error instanceof ExpandApiError || error instanceof ExpandClientApiError) {
|
|
35
|
+
const body = error.body;
|
|
36
|
+
return Predicate.hasProperty(body, 'error') ? read(body.error) : read(body);
|
|
37
|
+
}
|
|
38
|
+
return Option.flatMap(parseErrorBody(error), read);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ParseErrorBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParseErrorBody.js","sourceRoot":"","sources":["../../src/ParseErrorBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC5C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;IACjC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAC3F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAc,EAAE,GAAW,EAAE,MAAwC;IAClG,MAAM,IAAI,GAAG,CAAC,MAAe,EAAoB,EAAE,CAClD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IACrG,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;QACtC,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC9E,MAAM,IAAI,GAAY,KAAK,CAAC,IAAI,CAAA;YAChC,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACH,CAAC"}
|
package/build/esm/Playground.js
CHANGED
|
@@ -24,6 +24,44 @@ function legacyArchiveId(value) {
|
|
|
24
24
|
export function playgroundBase(snapshotId, host = DEFAULT_PLAYGROUND_HOST) {
|
|
25
25
|
return `${normalizeHost(host)}/s/${encodeURIComponent(snapshotId)}`;
|
|
26
26
|
}
|
|
27
|
+
/** Appendix-only Markdown: `${host}/s/${snapshotId}/appendix` (public, `text/markdown`). */
|
|
28
|
+
export function playgroundAppendixUrl(snapshotId, host = DEFAULT_PLAYGROUND_HOST) {
|
|
29
|
+
return `${playgroundBase(snapshotId, host)}/appendix`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* One block as Markdown by evidence id: `${host}/s/${snapshotId}/content?id=N`
|
|
33
|
+
* (public, request with `Accept: text/markdown`). Without an id, the whole
|
|
34
|
+
* public Markdown document.
|
|
35
|
+
*/
|
|
36
|
+
export function playgroundContentUrl(snapshotId, evidenceId, host = DEFAULT_PLAYGROUND_HOST) {
|
|
37
|
+
const base = `${playgroundBase(snapshotId, host)}/content`;
|
|
38
|
+
const id = publicEvidenceId(evidenceId);
|
|
39
|
+
return id === undefined ? base : `${base}?id=${id}`;
|
|
40
|
+
}
|
|
41
|
+
const SNAPSHOT_ID_PATTERN = /^[A-Za-z0-9._~-]+$/u;
|
|
42
|
+
/**
|
|
43
|
+
* Accept either a bare snapshot id or any playground URL for the snapshot
|
|
44
|
+
* (`https://expand.land/s/<id>`, `/s/<id>/appendix`, `/s/<id>?id=612`) and
|
|
45
|
+
* return the id plus the host it was served from. Text-mode fetch output
|
|
46
|
+
* has no `meta.snapshotId`; the `playground:` front-matter line is the handle.
|
|
47
|
+
*/
|
|
48
|
+
export function parseSnapshotHandle(handle) {
|
|
49
|
+
const trimmed = handle.trim();
|
|
50
|
+
if (trimmed.length === 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (SNAPSHOT_ID_PATTERN.test(trimmed))
|
|
53
|
+
return { snapshotId: trimmed };
|
|
54
|
+
try {
|
|
55
|
+
const url = new URL(trimmed);
|
|
56
|
+
const match = /^\/s\/([^/]+)/u.exec(url.pathname);
|
|
57
|
+
if (!match?.[1])
|
|
58
|
+
return undefined;
|
|
59
|
+
return { snapshotId: decodeURIComponent(match[1]), host: url.origin };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
27
65
|
/** Origin of a server-provided `meta.playground` URL, for reuse as the host (staging-safe). */
|
|
28
66
|
export function playgroundOrigin(metaPlayground) {
|
|
29
67
|
return new URL(metaPlayground).origin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Playground.js","sourceRoot":"","sources":["../../src/Playground.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Playground.js","sourceRoot":"","sources":["../../src/Playground.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Headers, HttpClient } from '@effect/platform';
|
|
2
|
+
import { Duration, Effect, FiberRef, Option, Random } from 'effect';
|
|
3
|
+
import { errorField } from './ParseErrorBody.js';
|
|
4
|
+
const RETRY_AFTER_HEADER = 'retry-after';
|
|
5
|
+
/**
|
|
6
|
+
* Upper bound on any single wait between attempts, server-requested or our own. `Retry-After` is a
|
|
7
|
+
* hint from a remote we do not control, and honouring an arbitrarily large one would park a
|
|
8
|
+
* caller's request far past its own timeout budget; the same bound applies to the exponential
|
|
9
|
+
* backoff, which a large `maxRetries` would otherwise grow past it. Two minutes is well above the
|
|
10
|
+
* largest value the API sends and well below any plausible caller patience.
|
|
11
|
+
*/
|
|
12
|
+
export const MAX_RETRY_AFTER = Duration.minutes(2);
|
|
13
|
+
/**
|
|
14
|
+
* `Retry-After` from the most recent response received on this fiber, or `None` if that response
|
|
15
|
+
* carried no usable value.
|
|
16
|
+
*
|
|
17
|
+
* The header cannot travel on the error: `HttpApiClient`-style decoding fails with the schema
|
|
18
|
+
* instance parsed from the body, and the `HttpClientResponse` — the only thing that has headers —
|
|
19
|
+
* is gone by the time a retry schedule runs. Recording it here keeps the signal reachable without
|
|
20
|
+
* threading a response through every call site. Every response overwrites it, so a value can never
|
|
21
|
+
* outlive the attempt that produced it, and a fiber only ever observes its own requests.
|
|
22
|
+
*/
|
|
23
|
+
const currentRetryAfter = FiberRef.unsafeMake(Option.none());
|
|
24
|
+
/**
|
|
25
|
+
* Rounded to whole milliseconds rather than kept as fractional seconds.
|
|
26
|
+
*
|
|
27
|
+
* `Duration.seconds(1.001)` is representable only in nanoseconds, so Effect backs it with a
|
|
28
|
+
* `bigint`, and arithmetic on a `bigint` duration rejects a fractional operand outright —
|
|
29
|
+
* `Duration.times(d, 1.125)` throws `RangeError: The number 1.125 cannot be converted to a BigInt`.
|
|
30
|
+
* Both callers can produce a fraction: an HTTP-date differs from now by an arbitrary sub-second
|
|
31
|
+
* amount, and `retryAfterSeconds` is a JSON number. Normalizing here keeps every downstream
|
|
32
|
+
* duration millisecond-backed, so the jitter below is plain number arithmetic. Sub-millisecond
|
|
33
|
+
* precision is meaningless for a retry wait.
|
|
34
|
+
*/
|
|
35
|
+
const positiveSeconds = (seconds) => Number.isFinite(seconds) && seconds > 0
|
|
36
|
+
? Option.some(Duration.min(Duration.millis(Math.round(seconds * 1_000)), MAX_RETRY_AFTER))
|
|
37
|
+
: Option.none();
|
|
38
|
+
/** Parses both `Retry-After` forms: delta-seconds and an HTTP-date. */
|
|
39
|
+
const parseRetryAfter = (value) => {
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if (/^\d+$/.test(trimmed))
|
|
42
|
+
return positiveSeconds(Number(trimmed));
|
|
43
|
+
const retryAt = Date.parse(trimmed);
|
|
44
|
+
return Number.isNaN(retryAt) ? Option.none() : positiveSeconds((retryAt - Date.now()) / 1_000);
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Records the `Retry-After` of every response the client receives, so {@link retryAfterDelay} can
|
|
48
|
+
* read it back when a failure is about to be retried.
|
|
49
|
+
*/
|
|
50
|
+
export const recordRetryAfter = (client) => HttpClient.tap(
|
|
51
|
+
// Cleared before the request, not just overwritten after it. An attempt that fails at the
|
|
52
|
+
// transport level never produces a response to overwrite the previous one, so without this the
|
|
53
|
+
// next attempt would sleep on a wait some earlier response asked for — a connection reset would
|
|
54
|
+
// inherit a saturated gate's 20s.
|
|
55
|
+
HttpClient.tapRequest(client, () => FiberRef.set(currentRetryAfter, Option.none())), (response) => FiberRef.set(currentRetryAfter, Option.flatMap(Headers.get(response.headers, RETRY_AFTER_HEADER), parseRetryAfter)));
|
|
56
|
+
/**
|
|
57
|
+
* Reads `retryAfterSeconds` off a decoded error body. Errors that can name their own recovery time
|
|
58
|
+
* say so in the body as well as the header; the body wins because it survives proxies that strip
|
|
59
|
+
* headers, and because it is the value the server actually chose for this error rather than for
|
|
60
|
+
* this status.
|
|
61
|
+
*/
|
|
62
|
+
const bodyRetryAfter = (error) => Option.flatMap(
|
|
63
|
+
// Through `errorField` rather than off the error directly, so a body this client could not
|
|
64
|
+
// decode still gets to name its own wait. An unknown error class is both the one whose delay
|
|
65
|
+
// no client-side default can guess and the one certain to fail the decode.
|
|
66
|
+
errorField(error, 'retryAfterSeconds', (value) => typeof value === 'number'), positiveSeconds);
|
|
67
|
+
/**
|
|
68
|
+
* Widest multiple of a server-requested wait this will actually sleep. Jitter only ever runs the
|
|
69
|
+
* wait *longer*: the server named the earliest moment worth trying again, so spreading below it
|
|
70
|
+
* would retry sooner than asked, which is the thing the header exists to prevent.
|
|
71
|
+
*/
|
|
72
|
+
const RETRY_AFTER_JITTER = 1.25;
|
|
73
|
+
/**
|
|
74
|
+
* Spreads a server-requested wait across a window so a whole rejected population does not wake at
|
|
75
|
+
* once. The value is a policy constant chosen per status rather than per caller, so every client
|
|
76
|
+
* refused in the same burst is handed the identical number; sleeping it raw would reconverge them
|
|
77
|
+
* on one instant and march them into the same saturated gate together, which is the behaviour the
|
|
78
|
+
* wait was supposed to break up.
|
|
79
|
+
*/
|
|
80
|
+
export const spreadRetryAfter = (retryAfter) => Effect.map(Random.next, (factor) =>
|
|
81
|
+
// Scaled as milliseconds rather than with `Duration.times`, which throws on a fractional
|
|
82
|
+
// factor whenever the duration happens to be nanosecond-backed. `positiveSeconds` already
|
|
83
|
+
// keeps our own values millisecond-backed; doing the arithmetic in numbers means an
|
|
84
|
+
// unrounded duration arriving from anywhere else cannot reintroduce that crash.
|
|
85
|
+
Duration.min(Duration.millis(Math.round(Duration.toMillis(retryAfter) * (1 + factor * (RETRY_AFTER_JITTER - 1)))), MAX_RETRY_AFTER));
|
|
86
|
+
/**
|
|
87
|
+
* How long the server asked us to wait before retrying this failure — `Duration.zero` when it asked
|
|
88
|
+
* for nothing, which leaves the caller's own backoff untouched.
|
|
89
|
+
*/
|
|
90
|
+
export const retryAfterDelay = (error) => Effect.map(FiberRef.get(currentRetryAfter), (fromHeader) => bodyRetryAfter(error).pipe(Option.orElse(() => fromHeader), Option.getOrElse(() => Duration.zero)));
|
|
91
|
+
/**
|
|
92
|
+
* The wait before the next attempt, given the failure and the backoff the schedule computed.
|
|
93
|
+
*
|
|
94
|
+
* A server that asked for a wait gets at least that wait: retrying sooner than it asked only
|
|
95
|
+
* spends the caller's timeout budget on a refusal it already predicted. The floor is re-jittered
|
|
96
|
+
* ({@link spreadRetryAfter}) because the server hands every client refused in the same burst the
|
|
97
|
+
* identical constant. Backoff wins when it is the longer of the two, but never past
|
|
98
|
+
* {@link MAX_RETRY_AFTER} — a large `maxRetries` must not grow the exponential past what we would
|
|
99
|
+
* accept from the server.
|
|
100
|
+
*/
|
|
101
|
+
export const nextRetryDelay = (error, backoff) => Effect.flatMap(retryAfterDelay(error), (retryAfter) => Duration.greaterThan(retryAfter, backoff)
|
|
102
|
+
? spreadRetryAfter(retryAfter)
|
|
103
|
+
: Effect.succeed(Duration.min(backoff, MAX_RETRY_AFTER)));
|
|
104
|
+
//# sourceMappingURL=RetryAfter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryAfter.js","sourceRoot":"","sources":["../../src/RetryAfter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,kBAAkB,GAAG,aAAa,CAAA;AAExC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAElD;;;;;;;;;GASG;AACH,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAqB,CAAC,CAAA;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,eAAe,GAAG,CAAC,OAAe,EAAoC,EAAE,CAC7E,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;IACtC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC1F,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAEjB,uEAAuE;AACvE,MAAM,eAAe,GAAG,CAAC,KAAa,EAAoC,EAAE;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA;AAC/F,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAO,MAAwC,EAAoC,EAAE,CACpH,UAAU,CAAC,GAAG;AACb,0FAA0F;AAC1F,+FAA+F;AAC/F,gGAAgG;AAChG,kCAAkC;AAClC,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EACnF,CAAC,QAAQ,EAAE,EAAE,CACZ,QAAQ,CAAC,GAAG,CACX,iBAAiB,EACjB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,eAAe,CAAC,CAClF,CACF,CAAA;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC3E,MAAM,CAAC,OAAO;AACb,2FAA2F;AAC3F,6FAA6F;AAC7F,2EAA2E;AAC3E,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAC7F,eAAe,CACf,CAAA;AAEF;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAA6B,EAAoC,EAAE,CACnG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;AAClC,yFAAyF;AACzF,0FAA0F;AAC1F,oFAAoF;AACpF,gFAAgF;AAChF,QAAQ,CAAC,GAAG,CACX,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACpG,eAAe,CACf,CACD,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAc,EAAoC,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1D,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrC,CACD,CAAA;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,OAA0B,EAAoC,EAAE,CAC9G,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CACrD,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC;IACxC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC;IAC9B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CACzD,CAAA"}
|
package/build/esm/Service.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { HttpClient, HttpClientRequest, HttpClientResponse } from '@effect/platform';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import { ExpandSdkError } from './Error.js';
|
|
5
|
-
import { fetchObjectModeJson,
|
|
2
|
+
import { Cause, Context, Duration, Effect, flow, Layer, MutableRef, Option, Random, Schedule, Schema } from 'effect';
|
|
3
|
+
import * as EnvProxyHttpClient from './EnvProxyHttpClient.js';
|
|
4
|
+
import { ExpandApiError, ExpandSdkError } from './Error.js';
|
|
5
|
+
import { fetchObjectModeJson, fetchSnapshotHighlights, } from './FetchJson.js';
|
|
6
6
|
import * as Generated from './Generated.js';
|
|
7
7
|
import { decodeError, unexpectedStatus } from './HttpClientHelpers.js';
|
|
8
8
|
import { isRetryable, toExpandError } from './Internal.js';
|
|
9
|
+
import { nextRetryDelay, recordRetryAfter } from './RetryAfter.js';
|
|
9
10
|
const DEFAULT_BASE_URL = 'https://api.expand.ai';
|
|
10
11
|
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
11
12
|
const DEFAULT_MAX_RETRIES = 2;
|
|
@@ -74,6 +75,12 @@ export const buildServiceConfig = Effect.fn('buildServiceConfig')(function* (opt
|
|
|
74
75
|
if (!apiKey) {
|
|
75
76
|
return yield* new ExpandSdkError({ message: 'Missing Expand API key. Pass apiKey or set EXPAND_API_KEY.' });
|
|
76
77
|
}
|
|
78
|
+
// Checked here, not only in the HttpClient layer, so `new ExpandClient()` keeps its
|
|
79
|
+
// documented sync-throw contract for bad configuration instead of rejecting later.
|
|
80
|
+
const invalidProxy = EnvProxyHttpClient.invalidProxyEnvMessage();
|
|
81
|
+
if (Option.isSome(invalidProxy)) {
|
|
82
|
+
return yield* new ExpandSdkError({ message: invalidProxy.value });
|
|
83
|
+
}
|
|
77
84
|
return yield* Schema.decode(ServiceConfig)({
|
|
78
85
|
apiKey,
|
|
79
86
|
baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
|
|
@@ -95,11 +102,14 @@ export const buildServiceConfig = Effect.fn('buildServiceConfig')(function* (opt
|
|
|
95
102
|
* ```
|
|
96
103
|
*/
|
|
97
104
|
export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService', {
|
|
98
|
-
dependencies: [
|
|
105
|
+
dependencies: [EnvProxyHttpClient.layer],
|
|
99
106
|
effect: Effect.gen(function* () {
|
|
100
107
|
const config = yield* ServiceConfigTag;
|
|
101
108
|
const httpClient = yield* HttpClient.HttpClient;
|
|
102
|
-
const authedClient = httpClient.pipe(HttpClient.mapRequest(flow(HttpClientRequest.prependUrl(config.baseUrl), HttpClientRequest.setHeader('x-expand-api-key', config.apiKey)))
|
|
109
|
+
const authedClient = httpClient.pipe(HttpClient.mapRequest(flow(HttpClientRequest.prependUrl(config.baseUrl), HttpClientRequest.setHeader('x-expand-api-key', config.apiKey))),
|
|
110
|
+
// Wraps every path, generated and hand-written alike, so `withRetries` can honour a
|
|
111
|
+
// `Retry-After` no matter which call produced the failure.
|
|
112
|
+
recordRetryAfter);
|
|
103
113
|
const generated = Generated.make(authedClient);
|
|
104
114
|
const fetchMarkdown = (params, queryParams = {}) => HttpClientRequest.make('POST')('/v1/fetch').pipe(
|
|
105
115
|
// Coalesce null -> undefined: the generated `include` schema is nullable, but `setUrlParams`
|
|
@@ -109,11 +119,15 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
|
|
|
109
119
|
'400': (response) => decodeError(response, Generated.FetchFetch400),
|
|
110
120
|
'401': (response) => decodeError(response, Generated.AuthFailed),
|
|
111
121
|
'403': (response) => decodeError(response, Generated.FetchFetch403),
|
|
112
|
-
'
|
|
113
|
-
'
|
|
122
|
+
'404': (response) => decodeError(response, Generated.FetchOriginNotFound),
|
|
123
|
+
'410': (response) => decodeError(response, Generated.FetchOriginGone),
|
|
124
|
+
'413': (response) => decodeError(response, Generated.FetchFetch413),
|
|
125
|
+
'415': (response) => decodeError(response, Generated.FetchUnsupportedContentType),
|
|
126
|
+
'422': (response) => decodeError(response, Generated.FetchVideoUnavailable),
|
|
127
|
+
'429': (response) => decodeError(response, Generated.FetchFetch429),
|
|
114
128
|
'500': (response) => decodeError(response, Generated.InternalError),
|
|
115
|
-
'502': (response) => decodeError(response, Generated.
|
|
116
|
-
'503': (response) => decodeError(response, Generated.
|
|
129
|
+
'502': (response) => decodeError(response, Generated.FetchFetch502),
|
|
130
|
+
'503': (response) => decodeError(response, Generated.FetchFetch503),
|
|
117
131
|
'504': (response) => decodeError(response, Generated.FetchCaptureTimeout),
|
|
118
132
|
'529': (response) => decodeError(response, Generated.FetchCapacityTimeout),
|
|
119
133
|
orElse: (response) => unexpectedStatus(request, response),
|
|
@@ -123,10 +137,25 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
|
|
|
123
137
|
const withRetries = Effect.fn('ExpandService.withRetries')(function* (operation, requestOptions = {}) {
|
|
124
138
|
const totalTimeoutMs = requestOptions.timeoutMs ?? config.timeoutMs;
|
|
125
139
|
const maxRetries = requestOptions.maxRetries ?? config.maxRetries;
|
|
140
|
+
// The failure the schedule last chose to wait on, while the fiber is inside that wait.
|
|
141
|
+
// If the wall-clock budget expires mid-wait, the caller is handed this refusal rather
|
|
142
|
+
// than a timeout: the server said "not before X", the caller said "no later than Y",
|
|
143
|
+
// and a timeout would hide the 429/503 the caller branches on. Cleared before every
|
|
144
|
+
// attempt, so a budget that expires during a live attempt still reports as a timeout.
|
|
145
|
+
const pendingRefusal = MutableRef.make(Option.none());
|
|
126
146
|
// `timeoutMs` is one wall-clock budget for the operation, including retries and backoff. A slow
|
|
127
147
|
// valid capture may use most of that budget; only failures that arrive before it expires can retry.
|
|
128
|
-
const retrySchedule = Schedule.exponential(Duration.millis(250)).pipe(Schedule.jittered, Schedule.compose(Schedule.recurs(maxRetries)), Schedule.whileInput((error) => isRetryable(error, totalTimeoutMs))
|
|
129
|
-
|
|
148
|
+
const retrySchedule = Schedule.exponential(Duration.millis(250)).pipe(Schedule.jittered, Schedule.compose(Schedule.recurs(maxRetries)), Schedule.whileInput((error) => isRetryable(error, totalTimeoutMs)),
|
|
149
|
+
// `passthrough` republishes the failure as the schedule's output so the delay function
|
|
150
|
+
// can see which error it is about to wait on.
|
|
151
|
+
Schedule.passthrough,
|
|
152
|
+
// Floors the delay at the server's requested wait (re-jittered) and caps it at
|
|
153
|
+
// `MAX_RETRY_AFTER`; the whole policy lives with its inputs in `RetryAfter.ts`.
|
|
154
|
+
Schedule.modifyDelayEffect((error, backoff) => Effect.zipLeft(nextRetryDelay(error, backoff), Effect.sync(() => MutableRef.set(pendingRefusal, Option.some(error))))));
|
|
155
|
+
return yield* Effect.sync(() => MutableRef.set(pendingRefusal, Option.none())).pipe(Effect.zipRight(operation), Effect.retry(retrySchedule), Effect.timeoutFail({
|
|
156
|
+
duration: Duration.millis(totalTimeoutMs),
|
|
157
|
+
onTimeout: () => Option.getOrElse(MutableRef.get(pendingRefusal), () => new Cause.TimeoutException()),
|
|
158
|
+
}), Effect.mapError((error) => toExpandError(error, totalTimeoutMs)));
|
|
130
159
|
});
|
|
131
160
|
const fetch = Effect.fn('ExpandService.fetch')(function* (params, requestOptions = {}) {
|
|
132
161
|
const { include, ...retryOptions } = requestOptions;
|
|
@@ -138,10 +167,15 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
|
|
|
138
167
|
// Coalesce null -> undefined before `setUrlParams`, which throws on null.
|
|
139
168
|
return yield* withRetries(fetchObjectModeJson(authedClient, { params: { include: include ?? undefined }, payload: params }), retryOptions);
|
|
140
169
|
});
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
return
|
|
144
|
-
|
|
170
|
+
const publicClient = httpClient.pipe(HttpClient.mapRequest(HttpClientRequest.prependUrl(config.baseUrl)), recordRetryAfter);
|
|
171
|
+
function getSnapshot(params, options = {}) {
|
|
172
|
+
return params.highlights === undefined
|
|
173
|
+
? withRetries(Generated.make(publicClient).publicSnapshotsGetCatalog(encodeURIComponent(params.snapshotId), {}), options)
|
|
174
|
+
: withRetries(fetchSnapshotHighlights(authedClient, params.snapshotId, {
|
|
175
|
+
highlights: params.highlights,
|
|
176
|
+
include: params.include,
|
|
177
|
+
}), options);
|
|
178
|
+
}
|
|
145
179
|
const batched = Effect.fn('ExpandService.batched')(function* (params, requestOptions = {}) {
|
|
146
180
|
const { idempotencyKey: providedIdempotencyKey, ...retryOptions } = requestOptions;
|
|
147
181
|
const idempotencyKey = yield* Option.fromNullable(providedIdempotencyKey).pipe(Option.match({
|
|
@@ -182,7 +216,52 @@ export class ExpandService extends Effect.Service()('@expandai/sdk/ExpandService
|
|
|
182
216
|
const cancelBatched = Effect.fn('ExpandService.cancelBatched')(function* (id, requestOptions = {}) {
|
|
183
217
|
return yield* withRetries(generated.fetchCancelBatched(id), requestOptions);
|
|
184
218
|
});
|
|
185
|
-
|
|
219
|
+
// Crawl control routes intentionally do not use the fetch-only generator. They still
|
|
220
|
+
// share this service's authenticated client, wall-clock budget, and retry policy.
|
|
221
|
+
const crawlRequest = Effect.fn('ExpandService.crawlRequest')(function* (path, method, options = {}, body, idempotencyKey) {
|
|
222
|
+
const request = HttpClientRequest.make(method)(path);
|
|
223
|
+
const keyed = idempotencyKey === undefined
|
|
224
|
+
? request
|
|
225
|
+
: HttpClientRequest.setHeader(request, 'x-idempotency-key', idempotencyKey);
|
|
226
|
+
const encoded = body === undefined
|
|
227
|
+
? keyed
|
|
228
|
+
: yield* HttpClientRequest.bodyJson(keyed, body).pipe(Effect.mapError((cause) => new ExpandSdkError({ message: 'Invalid Crawl request body.', cause })));
|
|
229
|
+
return yield* withRetries(authedClient.execute(encoded).pipe(Effect.flatMap((response) => (response.status >= 200 && response.status < 300
|
|
230
|
+
? response.json
|
|
231
|
+
: response.json.pipe(Effect.catchAll(() => Effect.void))).pipe(Effect.flatMap((value) => {
|
|
232
|
+
if (response.status >= 200 && response.status < 300) {
|
|
233
|
+
// The hand-written interfaces mirror the versioned Crawl HTTP contract.
|
|
234
|
+
return Effect.succeed(value);
|
|
235
|
+
}
|
|
236
|
+
const error = typeof value === 'object' && value !== null && 'error' in value ? value.error : undefined;
|
|
237
|
+
const message = typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string'
|
|
238
|
+
? error.message
|
|
239
|
+
: `HTTP ${response.status}`;
|
|
240
|
+
return new ExpandApiError({ message, status: response.status, body: value });
|
|
241
|
+
})))), options);
|
|
242
|
+
});
|
|
243
|
+
// Mirrors the Promise client: a durable caller key is required before any request is issued,
|
|
244
|
+
// or an unretryable failure could not be replayed by key.
|
|
245
|
+
// Takes `string | undefined`: TypeScript does not stop a JavaScript caller, and
|
|
246
|
+
// reading `.length` off undefined threw where the contract promises a typed failure.
|
|
247
|
+
const requireCrawlIdempotencyKey = (value, operation) => value !== undefined && value.length >= 1 && value.length <= 255
|
|
248
|
+
? Effect.succeed(value)
|
|
249
|
+
: new ExpandSdkError({ message: `${operation} requires an idempotencyKey between 1 and 255 characters.` });
|
|
250
|
+
function crawlById(id) {
|
|
251
|
+
const path = `/v1/crawls/${encodeURIComponent(id)}`;
|
|
252
|
+
return {
|
|
253
|
+
id,
|
|
254
|
+
status: (options = {}) => crawlRequest(path, 'GET', options),
|
|
255
|
+
cancel: (options = {}) => crawlRequest(`${path}/cancel`, 'POST', options),
|
|
256
|
+
update: (patch, options = {}) => crawlRequest(path, 'PATCH', options, patch),
|
|
257
|
+
run: (options) => requireCrawlIdempotencyKey(options.idempotencyKey, 'Crawl.run').pipe(Effect.flatMap((idempotencyKey) => crawlRequest(`${path}/runs${options.replayOnly ? '/replay' : ''}`, 'POST', options, undefined, idempotencyKey))),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const crawls = Object.assign(crawlById, {
|
|
261
|
+
list: (options = {}) => crawlRequest(options.limit === undefined ? '/v1/crawls' : `/v1/crawls?limit=${encodeURIComponent(options.limit)}`, 'GET', options),
|
|
262
|
+
create: (request, options) => requireCrawlIdempotencyKey(options.idempotencyKey, 'Crawls.create').pipe(Effect.flatMap((idempotencyKey) => crawlRequest('/v1/crawls', 'POST', options, request, idempotencyKey)), Effect.map((created) => created.map(({ id }) => crawlById(id)))),
|
|
263
|
+
});
|
|
264
|
+
return { fetch, fetchJson, snapshots: { get: getSnapshot }, batched, getBatched, cancelBatched, crawls };
|
|
186
265
|
}),
|
|
187
266
|
}) {
|
|
188
267
|
/**
|
package/build/esm/Service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/Service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/Service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAUpH,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAoB,cAAc,EAAE,MAAM,YAAY,CAAA;AAC7E,OAAO,EAGN,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElE,MAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAChD,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAE7B;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,KAAK,CAAuB,sBAAsB,CAAC,CACnG;IACC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QAClD,WAAW,EAAE,mEAAmE;KAChF,CAAC;IACF,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QACnD,WAAW,EAAE,oDAAoD;KACjE,CAAC;IACF;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QACrD,WAAW,EACV,4FAA4F;YAC5F,kFAAkF;KACnF,CAAC;IACF;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QACtD,WAAW,EACV,kGAAkG;YAClG,gBAAgB;KACjB,CAAC;CACF,EACD,EAAE,WAAW,EAAE,+EAA+E,EAAE,CAChG;CAAG;AAEJ;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,KAAK,CAAiB,gBAAgB,CAAC,CACjF;IACC,yGAAyG;IACzG,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QACrD,WAAW,EAAE,oGAAoG;KACjH,CAAC;IACF,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;QACtD,WAAW,EAAE,wDAAwD;KACrE,CAAC;CACF,EACD,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAC1E;CAAG;AAiDJ,MAAM,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,qBAAqB,CAAC,CAAC;IAC9E,MAAM,EAAE,MAAM,CAAC,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC;CAAG;AAEL,MAAM,gBAAiB,SAAQ,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAG5E;CAAG;AAEN;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA6B;IACzG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC,CAAA;IAC5G,CAAC;IACD,oFAAoF;IACpF,mFAAmF;IACnF,MAAM,YAAY,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,CAAA;IAChE,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,gBAAgB;QAC5C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;KACrD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;AACpH,CAAC,CAAC,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,OAAO,EAAiB,CAAC,6BAA6B,EAAE;IACjG,YAAY,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAA;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;QAC/C,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CACnC,UAAU,CAAC,UAAU,CACpB,IAAI,CACH,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAC5C,iBAAiB,CAAC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,CAC9D,CACD;QACD,oFAAoF;QACpF,2DAA2D;QAC3D,gBAAgB,CAChB,CAAA;QACD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,CAAC,MAAmB,EAAE,WAAW,GAA8C,EAAE,EAAE,EAAE,CAC1G,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;QAC/C,6FAA6F;QAC7F,qFAAqF;QACrF,iBAAiB,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,EAC7E,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,MAAM,CAAC,OAAO,CACb,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAC7B,kBAAkB,CAAC,WAAW,CAAC;YAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YAClC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC;YAChE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,mBAAmB,CAAC;YACzE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,eAAe,CAAC;YACrE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,2BAA2B,CAAC;YACjF,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,qBAAqB,CAAC;YAC3E,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,mBAAmB,CAAC;YACzE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,oBAAoB,CAAC;YAC1E,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;SACzD,CAAC,CACF,CACD,CACD,CAAA;QAEF,wGAAwG;QACxG,uDAAuD;QACvD,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EACnE,SAAiC,EACjC,cAAc,GAAmB,EAAE;YAEnC,MAAM,cAAc,GAAG,cAAc,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAA;YACnE,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAA;YACjE,uFAAuF;YACvF,sFAAsF;YACtF,qFAAqF;YACrF,oFAAoF;YACpF,sFAAsF;YACtF,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAyB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;YAC7E,gGAAgG;YAChG,oGAAoG;YACpG,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACpE,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAC7C,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC3E,uFAAuF;YACvF,8CAA8C;YAC9C,QAAQ,CAAC,WAAW;YACpB,+EAA+E;YAC/E,gFAAgF;YAChF,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAc,EAAE,OAAO,EAAE,EAAE,CACtD,MAAM,CAAC,OAAO,CACb,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACrE,CACD,CACD,CAAA;YACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAClF,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC1B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAC3B,MAAM,CAAC,WAAW,CAAC;gBAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;gBACzC,SAAS,EAAE,GAAY,EAAE,CACxB,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;aACrF,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAChE,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EACvD,MAAmB,EACnB,cAAc,GAAwB,EAAE;YAExC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,cAAc,CAAA;YACnD,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAC/D,MAAuB,EACvB,cAAc,GAA4B,EAAE;YAE5C,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,cAAc,CAAA;YACnD,+FAA+F;YAC/F,0EAA0E;YAC1E,OAAO,KAAK,CAAC,CAAC,WAAW,CACxB,mBAAmB,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EACjG,YAAY,CACZ,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CACnC,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EACnE,gBAAgB,CAChB,CAAA;QAaD,SAAS,WAAW,CACnB,MAAyB,EACzB,OAAO,GAAmB,EAAE;YAE5B,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS;gBACrC,CAAC,CAAC,WAAW,CACX,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EACjG,OAAO,CACP;gBACF,CAAC,CAAC,WAAW,CACX,uBAAuB,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE;oBACxD,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACvB,CAAC,EACF,OAAO,CACP,CAAA;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAC3D,MAAqB,EACrB,cAAc,GAA0B,EAAE;YAE1C,MAAM,EAAE,cAAc,EAAE,sBAAsB,EAAE,GAAG,YAAY,EAAE,GAAG,cAAc,CAAA;YAClF,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,KAAK,CAAC;gBACZ,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,MAAM,EAAE,GAAG,EAAE,CACZ,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAChE,MAAM,CAAC,GAAG,CACT,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CACvG,CACD;aACF,CAAC,CACF,CAAA;YACD,4EAA4E;YAC5E,uEAAuE;YACvE,wEAAwE;YACxE,EAAE;YACF,wEAAwE;YACxE,uEAAuE;YACvE,0EAA0E;YAC1E,UAAU;YACV,MAAM,SAAS,GAAG,cAAc,CAAC,iBAAiB,IAAI,EAAE,CAAA;YACxD,0EAA0E;YAC1E,sEAAsE;YACtE,sEAAsE;YACtE,qBAAqB;YACrB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACxD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CACxD,CAAA;YACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC;oBAChC,OAAO,EAAE,8DAA8D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9F,CAAC,CAAA;YACH,CAAC;YACD,MAAM,gBAAgB,GAAiD;gBACtE,MAAM,EAAE,EAAE,mBAAmB,EAAE,cAAc,EAAE;gBAC/C,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE;aACpC,CAAA;YACD,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAA;QAClF,CAAC,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EACjE,EAAU,EACV,OAAO,GAAsC,EAAE;YAE/C,8FAA8F;YAC9F,oFAAoF;YACpF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAA;YACpD,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5F,CAAC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EACvE,EAAU,EACV,cAAc,GAAmB,EAAE;YAEnC,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;QAEF,qFAAqF;QACrF,kFAAkF;QAClF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EACrE,IAAY,EACZ,MAAgC,EAChC,OAAO,GAAmB,EAAE,EAC5B,IAAc,EACd,cAAuB;YAEvB,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,KAAK,GACV,cAAc,KAAK,SAAS;gBAC3B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAA;YAC7E,MAAM,OAAO,GACZ,IAAI,KAAK,SAAS;gBACjB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,CAAC,CACjG,CAAA;YACJ,OAAO,KAAK,CAAC,CAAC,WAAW,CACxB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACjC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC3B,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;gBAC/C,CAAC,CAAC,QAAQ,CAAC,IAAI;gBACf,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACxD,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACrD,wEAAwE;oBACxE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAqB,CAAC,CAAA;gBAC7C,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;gBACvG,MAAM,OAAO,GACZ,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;oBACrG,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAA;gBAC7B,OAAO,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YAC7E,CAAC,CAAC,CACF,CACD,CACD,EACD,OAAO,CACP,CAAA;QACF,CAAC,CAAC,CAAA;QACF,6FAA6F;QAC7F,0DAA0D;QAC1D,gFAAgF;QAChF,qFAAqF;QACrF,MAAM,0BAA0B,GAAG,CAClC,KAAyB,EACzB,SAAiB,EACuB,EAAE,CAC1C,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;YAC9D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,2DAA2D,EAAE,CAAC,CAAA;QAC5G,SAAS,SAAS,CAAC,EAAU;YAC5B,MAAM,IAAI,GAAG,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAA;YACnD,OAAO;gBACN,EAAE;gBACF,MAAM,EAAE,CAAC,OAAO,GAAmB,EAAE,EAAE,EAAE,CAAC,YAAY,CAAc,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;gBACzF,MAAM,EAAE,CAAC,OAAO,GAAmB,EAAE,EAAE,EAAE,CAAC,YAAY,CAAc,GAAG,IAAI,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;gBACtG,MAAM,EAAE,CACP,KAIC,EACD,OAAO,GAAmB,EAAE,EAC3B,EAAE,CAAC,YAAY,CAAc,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;gBAC7D,GAAG,EAAE,CAAC,OAAyC,EAAE,EAAE,CAClD,0BAA0B,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CACnE,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CACjC,YAAY,CACX,GAAG,IAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EACpD,MAAM,EACN,OAAO,EACP,SAAS,EACT,cAAc,CACd,CACD,CACD;aACF,CAAA;QACF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YACvC,IAAI,EAAE,CAAC,OAAO,GAAiD,EAAE,EAAE,EAAE,CACpE,YAAY,CACX,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EACpG,KAAK,EACL,OAAO,CACP;YACF,MAAM,EAAE,CAAC,OAAqB,EAAE,OAA4C,EAAE,EAAE,CAC/E,0BAA0B,CAAC,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,IAAI,CACvE,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CACjC,YAAY,CAAqC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CACxG,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAC/D;SACF,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAW,CAAA;IAClH,CAAC,CAAC;CACF,CAAC;IACD;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,GAAyB,EAAE;QAC9C,OAAO,KAAK,CAAC,YAAY,CACxB,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAC1G,CACD,CAAA;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BackoffDefaults, stream } from '@durable-streams/client';
|
|
2
|
+
/** live:false reads one bounded server response, never the complete retained history. */
|
|
3
|
+
export async function readStreamPage(response) {
|
|
4
|
+
if (response.live !== false)
|
|
5
|
+
throw new Error('A bounded stream page requires live:false.');
|
|
6
|
+
try {
|
|
7
|
+
const items = await response.json();
|
|
8
|
+
return {
|
|
9
|
+
items,
|
|
10
|
+
offset: response.offset,
|
|
11
|
+
upToDate: response.upToDate,
|
|
12
|
+
streamClosed: response.streamClosed,
|
|
13
|
+
cursor: response.cursor,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
response.cancel();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Decode bounded responses with the official protocol client while preserving the caller's auth transport. */
|
|
21
|
+
export class DurableStreamReader {
|
|
22
|
+
cursors = new Map();
|
|
23
|
+
cursor(key) {
|
|
24
|
+
return this.cursors.get(key);
|
|
25
|
+
}
|
|
26
|
+
async read(key, response, offset) {
|
|
27
|
+
const page = await readStreamPage(await stream({
|
|
28
|
+
url: response.url || 'https://stream.invalid/',
|
|
29
|
+
offset,
|
|
30
|
+
live: false,
|
|
31
|
+
json: true,
|
|
32
|
+
fetch: async () => response,
|
|
33
|
+
backoffOptions: { ...BackoffDefaults, maxRetries: 0 },
|
|
34
|
+
}));
|
|
35
|
+
this.cursors.delete(key);
|
|
36
|
+
if (!page.streamClosed && page.cursor !== undefined)
|
|
37
|
+
this.cursors.set(key, page.cursor);
|
|
38
|
+
if (this.cursors.size > 128) {
|
|
39
|
+
const oldest = this.cursors.keys().next().value;
|
|
40
|
+
if (oldest !== undefined)
|
|
41
|
+
this.cursors.delete(oldest);
|
|
42
|
+
}
|
|
43
|
+
return page;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=StreamPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamPage.js","sourceRoot":"","sources":["../../src/StreamPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuC,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,QAA2B;IAClE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC1F,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAK,CAAA;QACtC,OAAO;YACN,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;SACvB,CAAA;IACF,CAAC;YAAS,CAAC;QACV,QAAQ,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;AACF,CAAC;AAED,+GAA+G;AAC/G,MAAM,OAAO,mBAAmB;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEpD,MAAM,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,GAAW,EAAE,QAAkB,EAAE,MAAc;QAC5D,MAAM,IAAI,GAAG,MAAM,cAAc,CAChC,MAAM,MAAM,CAAI;YACf,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,yBAAyB;YAC9C,MAAM;YACN,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;YAC3B,cAAc,EAAE,EAAE,GAAG,eAAe,EAAE,UAAU,EAAE,CAAC,EAAE;SACrD,CAAC,CACF,CAAA;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACvF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC/C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACtD,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;CACD"}
|
package/build/esm/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { APPENDIX_MARKER_PREFIX, AppendixMarkerLevel, isAppendixMarkerLine, parseAppendixMarkerLine, parseAppendixMarkers, stripAppendixMarkers, withoutFencedCode, } from './AppendixMarkers.js';
|
|
2
|
+
export { Expand, ExpandClient } from './Client.js';
|
|
3
|
+
export * from './Crawls.js';
|
|
2
4
|
export { ExpandApiError, ExpandClientApiError, ExpandClientConnectionError, ExpandClientError, ExpandClientTimeoutError, ExpandConnectionError, ExpandSdkError, ExpandTimeoutError, } from './Error.js';
|
|
5
|
+
export { isFetchOriginError } from './FetchJson.js';
|
|
6
|
+
export { citationUrl, DEFAULT_PLAYGROUND_HOST, parseSnapshotHandle, playgroundAppendixUrl, playgroundBase, playgroundContentUrl, resolvePlaygroundHost, } from './Playground.js';
|
|
3
7
|
export { ExpandService, ExpandServiceOptions, RequestOptions } from './Service.js';
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,sBAAsB,CAAA;AAqB7B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,cAAc,aAAa,CAAA;AAE3B,OAAO,EACN,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GAClB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EACN,WAAW,EACX,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expandai/sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"
|
|
4
|
+
"engines": {
|
|
5
|
+
"node": ">=20.3.0"
|
|
6
|
+
},
|
|
7
|
+
"version": "0.20.0",
|
|
5
8
|
"private": false,
|
|
6
9
|
"description": "TypeScript SDK for ExpandAI",
|
|
7
10
|
"author": "ExpandAI",
|
|
@@ -49,6 +52,7 @@
|
|
|
49
52
|
},
|
|
50
53
|
"scripts": {
|
|
51
54
|
"generate": "tsx scripts/generate-client.ts",
|
|
55
|
+
"example:disclosure": "tsx --tsconfig tsconfig.src.json examples/progressive-disclosure.ts",
|
|
52
56
|
"build": "tsc -b tsconfig.build.json",
|
|
53
57
|
"check": "tsc -b tsconfig.json",
|
|
54
58
|
"check:test": "tsc -b tsconfig.test.json",
|
|
@@ -60,6 +64,7 @@
|
|
|
60
64
|
"test:integration": "vitest run integration --fileParallelism=false --testTimeout=30000"
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
67
|
+
"@durable-streams/client": "^0.2.6",
|
|
63
68
|
"@effect/platform": "0.96.1",
|
|
64
69
|
"@effect/platform-node": "0.106.0",
|
|
65
70
|
"effect": "3.21.2"
|
|
@@ -70,5 +75,6 @@
|
|
|
70
75
|
"@tim-smart/openapi-gen": "0.3.12",
|
|
71
76
|
"@types/node": "^25.5.2",
|
|
72
77
|
"vitest": "4.1.4"
|
|
73
|
-
}
|
|
78
|
+
},
|
|
79
|
+
"expandSourceSha": "78c2a275281da76a71e19dcf978f3a32fe66e0fd"
|
|
74
80
|
}
|