apps 0.0.1-beta.8 → 0.0.1-beta.81
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 +25 -22
- package/framework-reference.json +1 -1
- package/js/{chunk-72JNVHPK.js → chunk-4NFSABEA.js} +4 -3
- package/js/chunk-5FHWNLCI.js +88 -0
- package/js/chunk-5WGONRKQ.js +426 -0
- package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
- package/js/chunk-CDXQDN7W.js +92 -0
- package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
- package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
- package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
- package/js/{chunk-FL2QR3XW.js → chunk-HJG4RBYM.js} +333 -69
- package/js/chunk-I6Q7ZPKJ.js +49 -0
- package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
- package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
- package/js/{chunk-5T57N25Q.js → chunk-KGCTYL2S.js} +511 -63
- package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
- package/js/{chunk-WLE7WX2U.js → chunk-NG56RPCA.js} +2348 -472
- package/js/chunk-OD3KFKZD.js +1617 -0
- package/js/{chunk-Z5M2LQOZ.js → chunk-OY47QPQY.js} +67 -55
- package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
- package/js/chunk-PL5KOEZD.js +334 -0
- package/js/chunk-Q4IZAUIF.js +285 -0
- package/js/{chunk-RJDDBDSN.js → chunk-QWQM3CLH.js} +795 -177
- package/js/{chunk-RFVIONFX.js → chunk-TE25A7D6.js} +123 -44
- package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
- package/js/chunk-W6XCQAXP.js +171 -0
- package/js/chunk-WCGAO3X5.js +348 -0
- package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
- package/js/{chunk-CMYUWAX7.js → chunk-YQUG4CES.js} +126 -31
- package/js/{chunk-UESPOTUI.js → chunk-Z2SWTZCF.js} +861 -231
- package/js/client.js +142 -94
- package/js/contracts.js +127 -26
- package/js/effect.js +19 -19
- package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
- package/js/graphql.js +50 -40
- package/js/host.js +83 -58
- package/js/index.js +131 -46
- package/js/mcp/effect.js +23 -21
- package/js/mcp/stdio.js +44 -34
- package/js/mcp.js +76 -53
- package/js/openapi.js +4071 -1357
- package/js/react.js +2 -3
- package/js/skills/effect.js +6 -3
- package/js/skills.js +208 -81
- package/js/storage/facet.js +1 -540
- package/js/ui/auth/contracts.js +2 -2
- package/js/ui/auth.js +5 -5
- package/js/ui/contracts.js +5 -4
- package/js/ui/serving.js +8604 -223
- package/package.json +3 -4
- package/runtime.json +1 -1
- package/types/app-cache/src/contracts/cache.d.ts +18 -0
- package/types/app-cache/src/index.d.ts +34 -2
- package/types/apps/src/contracts/api-response-error.d.ts +4 -0
- package/types/apps/src/contracts/app.d.ts +7 -3
- package/types/apps/src/contracts/cache.d.ts +20 -0
- package/types/apps/src/contracts/context.d.ts +19 -11
- package/types/apps/src/contracts/elicitation.d.ts +23 -7
- package/types/apps/src/contracts/events.d.ts +93 -0
- package/types/apps/src/contracts/failure.d.ts +30 -1
- package/types/apps/src/contracts/graphql.d.ts +2 -1
- package/types/apps/src/contracts/host.d.ts +649 -17
- package/types/apps/src/contracts/live.d.ts +2 -0
- package/types/apps/src/contracts/mcp.d.ts +80 -10
- package/types/apps/src/contracts/network.d.ts +120 -0
- package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
- package/types/apps/src/contracts/openapi.d.ts +41 -9
- package/types/apps/src/contracts/operations.d.ts +8 -4
- package/types/apps/src/contracts/placement.d.ts +102 -0
- package/types/apps/src/contracts/protocol-version.d.ts +2 -2
- package/types/apps/src/contracts/protocols/1.d.ts +733 -81
- package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
- package/types/apps/src/contracts/protocols/2.d.ts +69 -26
- package/types/apps/src/contracts/protocols/3.d.ts +133 -33
- package/types/apps/src/contracts/protocols/4.d.ts +122 -45
- package/types/apps/src/contracts/protocols/5.d.ts +157 -47
- package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
- package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
- package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
- package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
- package/types/apps/src/contracts/protocols/current.d.ts +3843 -0
- package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
- package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
- package/types/apps/src/contracts/provider-error.d.ts +9 -0
- package/types/apps/src/contracts/provider.d.ts +90 -6
- package/types/apps/src/contracts/skills.d.ts +50 -13
- package/types/apps/src/contracts/sql.d.ts +63 -0
- package/types/apps/src/contracts/ui.d.ts +37 -3
- package/types/apps/src/contracts/workflows.d.ts +6 -0
- package/types/apps/src/facet.d.ts +4 -5
- package/types/apps/src/host.d.ts +5 -0
- package/types/apps/src/implementation/account-router.d.ts +4 -3
- package/types/apps/src/implementation/authoring.d.ts +25 -5
- package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
- package/types/apps/src/implementation/cache.d.ts +28 -1
- package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
- package/types/apps/src/implementation/elicitation.d.ts +18 -15
- package/types/apps/src/implementation/events.d.ts +59 -0
- package/types/apps/src/implementation/failure-detail.d.ts +25 -3
- package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
- package/types/apps/src/implementation/graphql.d.ts +4 -3
- package/types/apps/src/implementation/input-problems.d.ts +6 -2
- package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
- package/types/apps/src/implementation/live.d.ts +2 -2
- package/types/apps/src/implementation/mcp-call.d.ts +6 -5
- package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
- package/types/apps/src/implementation/mcp-client.d.ts +17 -9
- package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
- package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
- package/types/apps/src/implementation/mcp.d.ts +20 -9
- package/types/apps/src/implementation/network.d.ts +16 -0
- package/types/apps/src/implementation/openapi-compile.d.ts +26 -6
- package/types/apps/src/implementation/openapi-document.d.ts +46 -19
- package/types/apps/src/implementation/openapi-names.d.ts +9 -4
- package/types/apps/src/implementation/openapi-request.d.ts +10 -2
- package/types/apps/src/implementation/openapi-source.d.ts +18 -0
- package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
- package/types/apps/src/implementation/operations.d.ts +17 -2
- package/types/apps/src/implementation/optimistic.d.ts +1 -1
- package/types/apps/src/implementation/placement.d.ts +60 -0
- package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
- package/types/apps/src/implementation/provider-error.d.ts +28 -1
- package/types/apps/src/implementation/provider.d.ts +18 -3
- package/types/apps/src/implementation/query-commit.d.ts +1 -1
- package/types/apps/src/implementation/router-catalog.d.ts +11 -13
- package/types/apps/src/implementation/router.d.ts +16 -5
- package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
- package/types/apps/src/implementation/schema.d.ts +90 -10
- package/types/apps/src/implementation/skills.d.ts +18 -24
- package/types/apps/src/implementation/sql.d.ts +71 -0
- package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
- package/types/apps/src/implementation/ui-auth.d.ts +1 -1
- package/types/apps/src/implementation/ui-client.d.ts +2 -2
- package/types/apps/src/implementation/ui-document.d.ts +5 -0
- package/types/apps/src/implementation/ui-errors.d.ts +1 -1
- package/types/apps/src/implementation/ui-serving.d.ts +28 -9
- package/types/apps/src/implementation/ui-watch.d.ts +1 -1
- package/types/apps/src/implementation/upstream-error.d.ts +7 -0
- package/types/apps/src/implementation/webhooks.d.ts +1 -1
- package/types/apps/src/implementation/workflows.d.ts +1 -1
- package/types/apps/src/index.d.ts +55 -13
- package/types/apps/src/mcp.d.ts +20 -1
- package/types/apps/src/openapi.d.ts +1 -1
- package/types/apps/src/react.d.ts +1 -1
- package/types/apps/src/skills.d.ts +10 -8
- package/types/apps/src/ui-serving.d.ts +1 -1
- package/types/telemetry/src/app-records.d.ts +42 -0
- package/types/telemetry/src/browser-operations.d.ts +2 -2
- package/types/telemetry/src/browser.d.ts +8 -3
- package/types/telemetry/src/config.d.ts +2 -2
- package/types/telemetry/src/index.d.ts +2 -1
- package/types/telemetry/src/layer.d.ts +10 -4
- package/types/telemetry/src/measurements.d.ts +1 -1
- package/types/telemetry/src/ownership.d.ts +60 -0
- package/types/telemetry/src/recorded-failure.d.ts +29 -0
- package/types/telemetry/src/relay.d.ts +16 -6
- package/types/telemetry/src/span-attributes.d.ts +17 -1
- package/types/telemetry/src/transport.d.ts +8 -1
- package/types/utils/src/api-error.d.ts +55 -0
- package/types/utils/src/connection-failure.d.ts +33 -0
- package/types/utils/src/recorded-message.d.ts +18 -0
- package/types/utils/src/user-facing-error.d.ts +83 -0
- package/js/chunk-MKWZPDR6.js +0 -63
- package/js/chunk-N7YDVXYJ.js +0 -186
- package/js/chunk-NKLWZJLE.js +0 -172
- package/js/chunk-OCYUEU47.js +0 -224
- package/js/chunk-PJJ24GU7.js +0 -877
- package/js/chunk-PZB6T6KU.js +0 -19
- package/js/chunk-R3EV5FTO.js +0 -97
- package/js/chunk-YXQHV65J.js +0 -242
- package/js/chunk-ZQINWV4W.js +0 -630
- package/types/app-data/src/implementation/cursor.d.ts +0 -10
- package/types/app-data/src/implementation/index-key.d.ts +0 -7
- package/types/app-data/src/implementation/promise.d.ts +0 -68
- package/types/app-data/src/implementation/range.d.ts +0 -8
- package/types/app-data/src/implementation/schema.d.ts +0 -18
- package/types/app-data/src/implementation/sqlite.d.ts +0 -11
- package/types/app-data/src/index.d.ts +0 -4
- package/types/apps/src/contracts/storage.d.ts +0 -68
- package/types/apps/src/implementation/storage.d.ts +0 -15
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Requests the browser could not complete because no response reached it. */
|
|
2
|
+
import { Cause } from "effect";
|
|
3
|
+
import { HttpClientError } from "effect/http";
|
|
4
|
+
import { UserFacingError } from "./user-facing-error.js";
|
|
5
|
+
/**
|
|
6
|
+
* Fetch rejects with a `TypeError` when no response arrives: the device is offline, the page
|
|
7
|
+
* navigated away first, the connection was reset before a response, or the browser blocked the
|
|
8
|
+
* request. The server may still have completed the request and records its own outcome. Failures Executor constructs itself, such as a batch reply
|
|
9
|
+
* that ended without an answer, carry no such cause and stay unexpected.
|
|
10
|
+
*/
|
|
11
|
+
export declare const isConnectionFailure: (error: unknown) => error is HttpClientError.HttpClientError;
|
|
12
|
+
/** Typed API clients may surface a lost connection as a failure or, after narrowing, a defect. */
|
|
13
|
+
export declare const hasConnectionFailure: (cause: Cause.Cause<unknown>) => boolean;
|
|
14
|
+
/** The browser could not reach Executor. Nothing on the server needs fixing. */
|
|
15
|
+
export declare const ConnectionFailed: import("effect/Schema").Class<{} & UserFacingError & {
|
|
16
|
+
readonly _tag: "ConnectionFailed";
|
|
17
|
+
}, Omit<import("effect/Schema").TaggedStruct<"ConnectionFailed", {
|
|
18
|
+
readonly message: typeof import("./api-error.js").MessageField;
|
|
19
|
+
readonly recovery: import("effect/Schema").decodeTo<import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
20
|
+
readonly action: import("effect/Schema").String;
|
|
21
|
+
readonly instructions: import("effect/Schema").String;
|
|
22
|
+
}>>, import("effect/Schema").Struct<{
|
|
23
|
+
readonly action: import("effect/Schema").String;
|
|
24
|
+
readonly instructions: import("effect/Schema").String;
|
|
25
|
+
}>, never, never>;
|
|
26
|
+
}>, "~type.make.in"> & {
|
|
27
|
+
readonly "~type.make.in": {
|
|
28
|
+
readonly _tag?: "ConnectionFailed";
|
|
29
|
+
};
|
|
30
|
+
}, UserFacingError>;
|
|
31
|
+
export type ConnectionFailed = typeof ConnectionFailed.Type;
|
|
32
|
+
/** What to show for a failure no contract declares: a lost connection, or an unexpected error. */
|
|
33
|
+
export declare const undeclaredError: (cause: Cause.Cause<unknown>) => UserFacingError;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fixed sentence traces and error reports record for a tagged error, beside its tag. Telemetry
|
|
3
|
+
* records no other text from a tagged error: one that declares no sentence is recorded by its tag
|
|
4
|
+
* alone (`@executor-js/telemetry/recorded-failure`). Declare one from fixed text and closed fields
|
|
5
|
+
* only, never from a value the caller supplied (a slug, a name, a tool name, an argument's key),
|
|
6
|
+
* an app's own text or a service's reply. That text still reaches the caller the error is for.
|
|
7
|
+
* `ApiError` and `UserFacingError` declare a fixed message for you; a message derived from fields
|
|
8
|
+
* declares `recorded`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RecordedMessage: unique symbol;
|
|
11
|
+
/** The fixed sentence an error declares for telemetry, if it declares one. */
|
|
12
|
+
export declare const recordedMessage: (error: unknown) => string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Declare a recorded message on one error that Executor did not define the text of, such as an
|
|
15
|
+
* error decoded from an app's reply. An error class's own declaration is kept. The error's fields
|
|
16
|
+
* and wire encoding are unchanged.
|
|
17
|
+
*/
|
|
18
|
+
export declare const recordAs: <E>(error: E, message: string) => E;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Schema, type Cause } from "effect";
|
|
2
|
+
import "effect/http-api";
|
|
3
|
+
import { MessageField } from "./api-error.js";
|
|
4
|
+
/** Curated explanation and recovery. Never include raw diagnostics, credentials, or form values. */
|
|
5
|
+
export interface ErrorPresentation {
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly description: string;
|
|
8
|
+
readonly recovery: {
|
|
9
|
+
readonly action: string;
|
|
10
|
+
readonly instructions: string;
|
|
11
|
+
};
|
|
12
|
+
/** Repeating the failed operation can help. Configuration changes are not retries. */
|
|
13
|
+
readonly retryable?: boolean;
|
|
14
|
+
/** False when the user's agent cannot act on the fix prompt, so hosts do not offer it. */
|
|
15
|
+
readonly agentFixable?: boolean;
|
|
16
|
+
/** One safe value the user needs for recovery, such as a URL to send to the service. */
|
|
17
|
+
readonly detail?: {
|
|
18
|
+
readonly label: string;
|
|
19
|
+
readonly value: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Present only when the Executor team must fix the problem. Safe evidence for a public
|
|
23
|
+
* report: fixed codes and statuses, never user data, URLs, or upstream text.
|
|
24
|
+
*/
|
|
25
|
+
readonly report?: string;
|
|
26
|
+
}
|
|
27
|
+
type PresentationProperties = Required<Omit<ErrorPresentation, "detail" | "report">> & {
|
|
28
|
+
readonly detail: ErrorPresentation["detail"];
|
|
29
|
+
readonly report: ErrorPresentation["report"];
|
|
30
|
+
readonly code: string;
|
|
31
|
+
readonly fixPrompt: string;
|
|
32
|
+
};
|
|
33
|
+
/** A yieldable error that owns its safe user explanation and agent recovery task. */
|
|
34
|
+
export interface UserFacingError extends Cause.YieldableError, PresentationProperties {
|
|
35
|
+
readonly _tag: string;
|
|
36
|
+
}
|
|
37
|
+
type Header<Tag extends string> = {
|
|
38
|
+
readonly tag: Tag;
|
|
39
|
+
readonly status: number;
|
|
40
|
+
};
|
|
41
|
+
type Definition<Tag extends string, Fields extends Schema.Struct.Fields> = Header<Tag> & {
|
|
42
|
+
readonly fields: Fields & {
|
|
43
|
+
readonly [Key in keyof PresentationProperties | "_tag" | "message"]?: never;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* What traces and error reports record beside the tag. A fixed description is recorded as is; a
|
|
47
|
+
* presentation derived from fields is recorded only through this, from fixed text and closed
|
|
48
|
+
* fields, never a value the caller chose, an app's text or a service's reply. Without it the
|
|
49
|
+
* error is recorded by its tag alone.
|
|
50
|
+
*/
|
|
51
|
+
readonly recorded?: (fields: Schema.Struct.Type<Fields>) => string;
|
|
52
|
+
} & (ErrorPresentation | {
|
|
53
|
+
readonly presentation: (fields: Schema.Struct.Type<Fields>) => ErrorPresentation;
|
|
54
|
+
});
|
|
55
|
+
declare const RecoveryField: Schema.decodeTo<Schema.optionalKey<Schema.Struct<{
|
|
56
|
+
readonly action: Schema.String;
|
|
57
|
+
readonly instructions: Schema.String;
|
|
58
|
+
}>>, Schema.Struct<{
|
|
59
|
+
readonly action: Schema.String;
|
|
60
|
+
readonly instructions: Schema.String;
|
|
61
|
+
}>, never, never>;
|
|
62
|
+
type DerivedFields = {
|
|
63
|
+
readonly message: typeof MessageField;
|
|
64
|
+
readonly recovery: typeof RecoveryField;
|
|
65
|
+
};
|
|
66
|
+
type ErrorFields<Tag extends string, Fields extends Schema.Struct.Fields> = Omit<Schema.TaggedStruct<Tag, Fields & DerivedFields>, "~type.make.in"> & {
|
|
67
|
+
readonly "~type.make.in": Schema.TaggedStruct<Tag, Fields>["~type.make.in"];
|
|
68
|
+
};
|
|
69
|
+
type ErrorClass<Tag extends string, Fields extends Schema.Struct.Fields> = Schema.Class<Schema.Struct.Type<Fields> & UserFacingError & {
|
|
70
|
+
readonly _tag: Tag;
|
|
71
|
+
}, ErrorFields<Tag, Fields>, UserFacingError>;
|
|
72
|
+
/** Define a schema-backed error with no payload. Its tag becomes its public error code. */
|
|
73
|
+
declare function define<const Tag extends string>(definition: Header<Tag> & ErrorPresentation): ErrorClass<Tag, {}>;
|
|
74
|
+
/** Define a schema-backed error whose safe presentation can depend on its parsed fields. */
|
|
75
|
+
declare function define<const Tag extends string, const Fields extends Schema.Struct.Fields>(definition: Definition<Tag, Fields>): ErrorClass<Tag, Fields>;
|
|
76
|
+
/** Define the schema, error constructor, user copy, and agent recovery together. */
|
|
77
|
+
export declare const UserFacingError: {
|
|
78
|
+
define: typeof define;
|
|
79
|
+
is: (value: unknown) => value is UserFacingError;
|
|
80
|
+
};
|
|
81
|
+
/** Defects get a safe explanation without exposing an arbitrary cause. */
|
|
82
|
+
export declare const UnexpectedError: ErrorClass<"UnexpectedError", {}>;
|
|
83
|
+
export {};
|
package/js/chunk-MKWZPDR6.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ProviderError
|
|
3
|
-
} from "./chunk-R3EV5FTO.js";
|
|
4
|
-
import {
|
|
5
|
-
AccountId
|
|
6
|
-
} from "./chunk-27F7W2LG.js";
|
|
7
|
-
import {
|
|
8
|
-
Option_exports,
|
|
9
|
-
Schema_exports
|
|
10
|
-
} from "./chunk-CDL5PM2Q.js";
|
|
11
|
-
|
|
12
|
-
// src/implementation/provider-error.ts
|
|
13
|
-
function parseProviderError(error) {
|
|
14
|
-
return Schema_exports.decodeUnknownOption(ProviderError)(error).pipe(
|
|
15
|
-
Option_exports.map(({ reason, status, accountId }) => new ProviderError({ reason, status, accountId }))
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
function httpProviderError(status, headers = {}) {
|
|
19
|
-
if (status >= 500 && status <= 599) return new ProviderError({ reason: "unavailable", status });
|
|
20
|
-
if (status === 401) return new ProviderError({ reason: "unauthorized", status });
|
|
21
|
-
if (status === 429) return new ProviderError({ reason: "rate_limited", status });
|
|
22
|
-
if (status !== 403) return void 0;
|
|
23
|
-
const retry = headers["retry-after"];
|
|
24
|
-
if (headers["x-ratelimit-remaining"] === "0" || retry !== void 0 && (/^\d+$/.test(retry) || Number.isFinite(Date.parse(retry))))
|
|
25
|
-
return new ProviderError({ reason: "rate_limited", status });
|
|
26
|
-
if (/\bBearer\b.*\berror="insufficient_scope"/i.test(headers["www-authenticate"] ?? ""))
|
|
27
|
-
return new ProviderError({ reason: "forbidden", status });
|
|
28
|
-
return new ProviderError({ reason: "rejected", status });
|
|
29
|
-
}
|
|
30
|
-
function accountProviderError(error, accountId) {
|
|
31
|
-
const parsed = parseProviderError(error);
|
|
32
|
-
const account = Schema_exports.decodeUnknownOption(AccountId)(accountId);
|
|
33
|
-
if (Option_exports.isNone(parsed) || Option_exports.isNone(account)) return error;
|
|
34
|
-
return new ProviderError({
|
|
35
|
-
reason: parsed.value.reason,
|
|
36
|
-
status: parsed.value.status,
|
|
37
|
-
accountId: account.value
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function graphqlProviderError(errors, status) {
|
|
41
|
-
const codes = errors.flatMap((error) => {
|
|
42
|
-
const parsed = Schema_exports.decodeUnknownOption(
|
|
43
|
-
Schema_exports.Struct({
|
|
44
|
-
type: Schema_exports.optional(Schema_exports.String),
|
|
45
|
-
extensions: Schema_exports.optional(Schema_exports.Struct({ code: Schema_exports.optional(Schema_exports.String) }))
|
|
46
|
-
})
|
|
47
|
-
)(error);
|
|
48
|
-
return Option_exports.isSome(parsed) ? [parsed.value.type, parsed.value.extensions?.code] : [];
|
|
49
|
-
});
|
|
50
|
-
if (codes.includes("RATE_LIMITED") || codes.includes("TOO_MANY_REQUESTS"))
|
|
51
|
-
return new ProviderError({ reason: "rate_limited", status });
|
|
52
|
-
if (codes.includes("UNAUTHENTICATED"))
|
|
53
|
-
return new ProviderError({ reason: "unauthorized", status });
|
|
54
|
-
if (codes.includes("FORBIDDEN")) return new ProviderError({ reason: "forbidden", status });
|
|
55
|
-
return void 0;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export {
|
|
59
|
-
parseProviderError,
|
|
60
|
-
httpProviderError,
|
|
61
|
-
accountProviderError,
|
|
62
|
-
graphqlProviderError
|
|
63
|
-
};
|
package/js/chunk-N7YDVXYJ.js
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Schema_exports
|
|
3
|
-
} from "./chunk-CDL5PM2Q.js";
|
|
4
|
-
|
|
5
|
-
// ../app-data/src/contracts/database.ts
|
|
6
|
-
var DataName = Schema_exports.String.check(
|
|
7
|
-
Schema_exports.makeFilter((value) => /^[A-Za-z][A-Za-z0-9_]*$/.test(value) && value.length <= 128)
|
|
8
|
-
);
|
|
9
|
-
var Scalar = Schema_exports.Union([Schema_exports.String, Schema_exports.Finite, Schema_exports.Boolean]);
|
|
10
|
-
var Field = Schema_exports.Struct({
|
|
11
|
-
kind: Schema_exports.Literals(["string", "number", "boolean", "id", "userId"]),
|
|
12
|
-
optional: Schema_exports.optional(Schema_exports.Boolean),
|
|
13
|
-
default: Schema_exports.optional(Scalar),
|
|
14
|
-
references: Schema_exports.optional(DataName)
|
|
15
|
-
});
|
|
16
|
-
var Index = Schema_exports.Struct({ name: DataName, fields: Schema_exports.NonEmptyArray(DataName) });
|
|
17
|
-
var Table = Schema_exports.Struct({
|
|
18
|
-
fields: Schema_exports.Record(DataName, Field),
|
|
19
|
-
indexes: Schema_exports.Array(Index)
|
|
20
|
-
});
|
|
21
|
-
var DatabaseSchema = Schema_exports.Record(DataName, Table);
|
|
22
|
-
var Row = Schema_exports.Record(Schema_exports.String, Scalar);
|
|
23
|
-
var RowMetadata = Schema_exports.Struct({
|
|
24
|
-
id: Schema_exports.NonEmptyString,
|
|
25
|
-
createdAt: Schema_exports.String,
|
|
26
|
-
updatedAt: Schema_exports.String
|
|
27
|
-
});
|
|
28
|
-
var Patch = Schema_exports.Record(DataName, Schema_exports.NullOr(Scalar));
|
|
29
|
-
var RangeClause = Schema_exports.Struct({
|
|
30
|
-
field: DataName,
|
|
31
|
-
op: Schema_exports.Literals(["eq", "gt", "gte", "lt", "lte"]),
|
|
32
|
-
value: Schema_exports.NullOr(Scalar)
|
|
33
|
-
});
|
|
34
|
-
var QueryPlan = Schema_exports.Struct({
|
|
35
|
-
table: DataName,
|
|
36
|
-
index: DataName,
|
|
37
|
-
order: Schema_exports.Literals(["asc", "desc"]),
|
|
38
|
-
clauses: Schema_exports.Array(RangeClause)
|
|
39
|
-
});
|
|
40
|
-
var QueryTerminal = Schema_exports.Union([
|
|
41
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("collect") }),
|
|
42
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("count") }),
|
|
43
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("first") }),
|
|
44
|
-
Schema_exports.Struct({
|
|
45
|
-
kind: Schema_exports.Literal("take"),
|
|
46
|
-
count: Schema_exports.Int.check(Schema_exports.isGreaterThanOrEqualTo(0))
|
|
47
|
-
}),
|
|
48
|
-
Schema_exports.Struct({
|
|
49
|
-
kind: Schema_exports.Literal("paginate"),
|
|
50
|
-
cursor: Schema_exports.NullOr(Schema_exports.String),
|
|
51
|
-
numItems: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
|
|
52
|
-
})
|
|
53
|
-
]);
|
|
54
|
-
var DatabaseOperation = Schema_exports.Union([
|
|
55
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("get"), table: DataName, id: Schema_exports.NonEmptyString }),
|
|
56
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("insert"), table: DataName, value: Patch }),
|
|
57
|
-
Schema_exports.Struct({
|
|
58
|
-
kind: Schema_exports.Literal("update"),
|
|
59
|
-
table: DataName,
|
|
60
|
-
id: Schema_exports.NonEmptyString,
|
|
61
|
-
patch: Patch
|
|
62
|
-
}),
|
|
63
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("delete"), table: DataName, id: Schema_exports.NonEmptyString }),
|
|
64
|
-
Schema_exports.Struct({ kind: Schema_exports.Literal("query"), plan: QueryPlan, terminal: QueryTerminal })
|
|
65
|
-
]);
|
|
66
|
-
var PaginationResult = Schema_exports.Struct({
|
|
67
|
-
page: Schema_exports.Array(Row),
|
|
68
|
-
continueCursor: Schema_exports.NullOr(Schema_exports.String),
|
|
69
|
-
isDone: Schema_exports.Boolean
|
|
70
|
-
});
|
|
71
|
-
var OperationResult = Schema_exports.Union([
|
|
72
|
-
Row,
|
|
73
|
-
Schema_exports.Array(Row),
|
|
74
|
-
PaginationResult,
|
|
75
|
-
Schema_exports.Boolean,
|
|
76
|
-
Schema_exports.Finite,
|
|
77
|
-
Schema_exports.Null
|
|
78
|
-
]);
|
|
79
|
-
var AppDatabaseError = class extends Schema_exports.TaggedError()("AppDatabaseError", {
|
|
80
|
-
reason: Schema_exports.Literals([
|
|
81
|
-
"schema",
|
|
82
|
-
"schema_changed",
|
|
83
|
-
"table",
|
|
84
|
-
"index",
|
|
85
|
-
"range",
|
|
86
|
-
"value",
|
|
87
|
-
"readonly",
|
|
88
|
-
"cursor",
|
|
89
|
-
"limit",
|
|
90
|
-
"closed",
|
|
91
|
-
"storage",
|
|
92
|
-
"replay"
|
|
93
|
-
])
|
|
94
|
-
}) {
|
|
95
|
-
};
|
|
96
|
-
var DatabaseLimits = Schema_exports.Struct({
|
|
97
|
-
rowsRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
98
|
-
rowsReturned: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
99
|
-
bytesRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
100
|
-
writes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
101
|
-
scanCalls: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
102
|
-
directGets: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
103
|
-
valueBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
104
|
-
indexBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
|
|
105
|
-
});
|
|
106
|
-
var defaultDatabaseLimits = {
|
|
107
|
-
rowsRead: 5e3,
|
|
108
|
-
rowsReturned: 1e3,
|
|
109
|
-
bytesRead: 4 * 1024 * 1024,
|
|
110
|
-
writes: 1e3,
|
|
111
|
-
scanCalls: 100,
|
|
112
|
-
directGets: 1e3,
|
|
113
|
-
valueBytes: 64 * 1024,
|
|
114
|
-
indexBytes: 2048
|
|
115
|
-
};
|
|
116
|
-
var DatabaseLimit = Schema_exports.Literals([
|
|
117
|
-
"scanCalls",
|
|
118
|
-
"directGets",
|
|
119
|
-
"rowsRead",
|
|
120
|
-
"rowsReturned",
|
|
121
|
-
"pageSize",
|
|
122
|
-
"bytesRead",
|
|
123
|
-
"writes",
|
|
124
|
-
"valueBytes"
|
|
125
|
-
]);
|
|
126
|
-
var count = (value) => value.toLocaleString("en-US");
|
|
127
|
-
var limitMessages = {
|
|
128
|
-
scanCalls: (maximum, requested) => `This invocation made ${count(requested)} index queries; the limit is ${count(maximum)}. Each first(), take(), collect(), count() or paginate() call on withIndex(...) counts once. Read related rows with one take() or paginate() over a shared index prefix instead of one first() per item, use get(id) for known IDs, or split the work across workflow steps.`,
|
|
129
|
-
directGets: (maximum, requested) => `This invocation made ${count(requested)} get(id) calls, including those made by update and delete; the limit is ${count(maximum)}. Split the work across workflow steps or mutations.`,
|
|
130
|
-
rowsRead: (maximum, requested) => `This invocation scanned ${count(requested)} rows; the limit is ${count(maximum)}. Narrow the index range, or page with paginate() across calls or workflow steps.`,
|
|
131
|
-
rowsReturned: (maximum, requested) => `This invocation returned ${count(requested)} rows; the limit is ${count(maximum)}. collect() fails rather than truncating. Page with paginate() across calls or workflow steps.`,
|
|
132
|
-
pageSize: (maximum, requested) => `One call asked for ${count(requested)} rows; take(n) and paginate({ numItems }) accept at most ${count(maximum)}. Page with paginate() across calls or workflow steps.`,
|
|
133
|
-
bytesRead: (maximum, requested) => `This invocation read ${count(requested)} bytes; the limit is ${count(maximum)}. Read fewer or smaller rows per call, or page with paginate() across calls or workflow steps.`,
|
|
134
|
-
writes: (maximum, requested) => `This mutation made ${count(requested)} writes; the limit is ${count(maximum)}. Split large ingests into batches, one batch per mutation or workflow step.`,
|
|
135
|
-
valueBytes: (maximum, requested) => `A row encodes to ${count(requested)} bytes; each row may use at most ${count(maximum)}. Store large content outside the row or split it across rows.`
|
|
136
|
-
};
|
|
137
|
-
var DatabaseLimitExceeded = class extends Schema_exports.TaggedError()(
|
|
138
|
-
"DatabaseLimitExceeded",
|
|
139
|
-
{
|
|
140
|
-
limit: DatabaseLimit,
|
|
141
|
-
maximum: Schema_exports.Int,
|
|
142
|
-
requested: Schema_exports.Int
|
|
143
|
-
}
|
|
144
|
-
) {
|
|
145
|
-
get message() {
|
|
146
|
-
return limitMessages[this.limit](this.maximum, this.requested);
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
var reservedFieldNames = ["id", "createdAt", "updatedAt"];
|
|
150
|
-
var DatabaseFieldReserved = class extends Schema_exports.TaggedError()(
|
|
151
|
-
"DatabaseFieldReserved",
|
|
152
|
-
{
|
|
153
|
-
table: Schema_exports.String,
|
|
154
|
-
field: Schema_exports.Literals(reservedFieldNames)
|
|
155
|
-
}
|
|
156
|
-
) {
|
|
157
|
-
get message() {
|
|
158
|
-
return `Table "${this.table}" declares "${this.field}", which is reserved: the host adds id, createdAt and updatedAt to every row. Rename the field, or use the row's own ${this.field}.`;
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
var DatabaseRuntimeLimits = Schema_exports.Struct({
|
|
162
|
-
maxCursorChars: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
163
|
-
connectionCacheCapacity: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
|
|
164
|
-
connectionCacheTtlMs: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
|
|
165
|
-
});
|
|
166
|
-
var defaultDatabaseRuntimeLimits = DatabaseRuntimeLimits.make({
|
|
167
|
-
maxCursorChars: 8192,
|
|
168
|
-
connectionCacheCapacity: 64,
|
|
169
|
-
connectionCacheTtlMs: 5 * 60 * 1e3
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
export {
|
|
173
|
-
DatabaseSchema,
|
|
174
|
-
Row,
|
|
175
|
-
RowMetadata,
|
|
176
|
-
RangeClause,
|
|
177
|
-
DatabaseOperation,
|
|
178
|
-
PaginationResult,
|
|
179
|
-
AppDatabaseError,
|
|
180
|
-
DatabaseLimits,
|
|
181
|
-
defaultDatabaseLimits,
|
|
182
|
-
DatabaseLimitExceeded,
|
|
183
|
-
reservedFieldNames,
|
|
184
|
-
DatabaseFieldReserved,
|
|
185
|
-
defaultDatabaseRuntimeLimits
|
|
186
|
-
};
|
package/js/chunk-NKLWZJLE.js
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CacheAcquired,
|
|
3
|
-
CacheEntry,
|
|
4
|
-
CacheError,
|
|
5
|
-
cacheLimits
|
|
6
|
-
} from "./chunk-R3EV5FTO.js";
|
|
7
|
-
import {
|
|
8
|
-
Clock_exports,
|
|
9
|
-
Duration_exports,
|
|
10
|
-
Effect_exports,
|
|
11
|
-
Exit_exports,
|
|
12
|
-
Schema_exports
|
|
13
|
-
} from "./chunk-CDL5PM2Q.js";
|
|
14
|
-
|
|
15
|
-
// ../app-cache/src/index.ts
|
|
16
|
-
var canonical = (value) => {
|
|
17
|
-
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
18
|
-
if (value !== null && typeof value === "object")
|
|
19
|
-
return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(",")}}`;
|
|
20
|
-
return JSON.stringify(value);
|
|
21
|
-
};
|
|
22
|
-
var cacheKey = (key) => Effect_exports.gen(function* () {
|
|
23
|
-
const parsed = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(key).pipe(
|
|
24
|
-
Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
|
|
25
|
-
);
|
|
26
|
-
const bytes = new TextEncoder().encode(canonical(parsed));
|
|
27
|
-
if (bytes.byteLength > cacheLimits.keyBytes)
|
|
28
|
-
return yield* new CacheError({ reason: "capacity" });
|
|
29
|
-
const hash = yield* Effect_exports.tryPromise({
|
|
30
|
-
try: () => crypto.subtle.digest("SHA-256", bytes),
|
|
31
|
-
catch: () => new CacheError({ reason: "invalid" })
|
|
32
|
-
});
|
|
33
|
-
return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
34
|
-
});
|
|
35
|
-
var makeCache = (host, background, scope = "shared", deadline) => {
|
|
36
|
-
const transport = (command) => host(command).pipe(
|
|
37
|
-
Effect_exports.withSpan("app.cache.command", {
|
|
38
|
-
attributes: { "cache.operation": command.operation }
|
|
39
|
-
})
|
|
40
|
-
);
|
|
41
|
-
const keyOf = (key) => cacheKey([scope, key]);
|
|
42
|
-
const readKeys = (keys) => transport({ operation: "read", keys }).pipe(
|
|
43
|
-
Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(Schema_exports.NullOr(CacheEntry)))),
|
|
44
|
-
Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
|
|
45
|
-
);
|
|
46
|
-
const durations = (freshFor, staleFor = 0) => Effect_exports.try({
|
|
47
|
-
try: () => {
|
|
48
|
-
const fresh = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(freshFor));
|
|
49
|
-
const stale = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(staleFor));
|
|
50
|
-
if (![fresh, stale].every((value) => Number.isFinite(value) && value >= 0) || fresh + stale > cacheLimits.retentionMs)
|
|
51
|
-
throw new CacheError({ reason: "invalid" });
|
|
52
|
-
return { fresh, stale };
|
|
53
|
-
},
|
|
54
|
-
catch: () => new CacheError({ reason: "invalid" })
|
|
55
|
-
});
|
|
56
|
-
const get = (options, refresh) => Effect_exports.gen(function* () {
|
|
57
|
-
const key = yield* keyOf(options.key);
|
|
58
|
-
const { fresh, stale } = yield* durations(options.freshFor, options.staleFor);
|
|
59
|
-
const decode = (value) => Schema_exports.decodeUnknownEffect(options.schema)(value);
|
|
60
|
-
const load = (lease) => Effect_exports.gen(function* () {
|
|
61
|
-
const value = yield* options.load.pipe(Effect_exports.flatMap(decode));
|
|
62
|
-
const json = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(value).pipe(
|
|
63
|
-
Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
|
|
64
|
-
);
|
|
65
|
-
const now = yield* Clock_exports.currentTimeMillis;
|
|
66
|
-
const published = yield* transport({
|
|
67
|
-
operation: "publish",
|
|
68
|
-
key,
|
|
69
|
-
lease,
|
|
70
|
-
entry: {
|
|
71
|
-
value: json,
|
|
72
|
-
version: crypto.randomUUID(),
|
|
73
|
-
freshUntil: now + fresh,
|
|
74
|
-
staleUntil: now + fresh + stale
|
|
75
|
-
}
|
|
76
|
-
}).pipe(Effect_exports.withSpan("app.cache.publish"));
|
|
77
|
-
if (published !== true) return yield* new CacheError({ reason: "unavailable" });
|
|
78
|
-
return value;
|
|
79
|
-
}).pipe(
|
|
80
|
-
Effect_exports.withSpan("app.cache.load"),
|
|
81
|
-
Effect_exports.timeout(cacheLimits.loadTimeoutMs),
|
|
82
|
-
// Publishing clears the lease in the same transaction. Only an unpublished load releases it.
|
|
83
|
-
Effect_exports.onExit(
|
|
84
|
-
(exit) => Exit_exports.isSuccess(exit) ? Effect_exports.void : transport({ operation: "release", key, lease }).pipe(
|
|
85
|
-
Effect_exports.catch(() => Effect_exports.void)
|
|
86
|
-
)
|
|
87
|
-
)
|
|
88
|
-
);
|
|
89
|
-
const waitUntil = Math.min(
|
|
90
|
-
(yield* Clock_exports.currentTimeMillis) + cacheLimits.waitMs,
|
|
91
|
-
deadline ?? Number.POSITIVE_INFINITY
|
|
92
|
-
);
|
|
93
|
-
let initialVersion;
|
|
94
|
-
while (true) {
|
|
95
|
-
const { entry, lease } = yield* transport({
|
|
96
|
-
operation: "acquire",
|
|
97
|
-
key,
|
|
98
|
-
refresh,
|
|
99
|
-
...initialVersion === void 0 ? {} : { version: initialVersion }
|
|
100
|
-
}).pipe(
|
|
101
|
-
Effect_exports.flatMap(
|
|
102
|
-
(reply) => Schema_exports.decodeUnknownEffect(CacheAcquired)(reply).pipe(
|
|
103
|
-
Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
|
|
104
|
-
)
|
|
105
|
-
)
|
|
106
|
-
);
|
|
107
|
-
const now = yield* Clock_exports.currentTimeMillis;
|
|
108
|
-
if (initialVersion === void 0) initialVersion = entry?.version ?? null;
|
|
109
|
-
const refreshed = refresh && entry !== null && entry.version !== initialVersion;
|
|
110
|
-
if (entry !== null && (refreshed || !refresh && lease === null && now < entry.freshUntil)) {
|
|
111
|
-
yield* Effect_exports.annotateCurrentSpan("cache.result", "fresh");
|
|
112
|
-
return yield* decode(entry.value);
|
|
113
|
-
}
|
|
114
|
-
if (!refresh && entry !== null && now < entry.staleUntil) {
|
|
115
|
-
yield* Effect_exports.annotateCurrentSpan("cache.result", "stale");
|
|
116
|
-
if (lease !== null) yield* background(load(lease).pipe(Effect_exports.asVoid));
|
|
117
|
-
return yield* decode(entry.value);
|
|
118
|
-
}
|
|
119
|
-
if (lease !== null) {
|
|
120
|
-
yield* Effect_exports.annotateCurrentSpan("cache.result", "miss");
|
|
121
|
-
return yield* load(lease);
|
|
122
|
-
}
|
|
123
|
-
if (now >= waitUntil) {
|
|
124
|
-
yield* Effect_exports.annotateCurrentSpan("cache.result", "local");
|
|
125
|
-
return yield* options.load.pipe(
|
|
126
|
-
Effect_exports.flatMap(decode),
|
|
127
|
-
Effect_exports.timeout(cacheLimits.loadTimeoutMs),
|
|
128
|
-
Effect_exports.withSpan("app.cache.load", { attributes: { "cache.load.leased": false } })
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
yield* Effect_exports.sleep("100 millis");
|
|
132
|
-
}
|
|
133
|
-
}).pipe(Effect_exports.withSpan("app.cache.get"));
|
|
134
|
-
return {
|
|
135
|
-
/** Read arbitrary retained JSON entries without initiating a refresh. Missing and null are distinct. */
|
|
136
|
-
read: (keys) => Effect_exports.forEach(keys, keyOf).pipe(Effect_exports.flatMap(readKeys)),
|
|
137
|
-
/** Publish bounded immutable parts before publishing the manifest that references them. */
|
|
138
|
-
write: (entries, retention) => Effect_exports.gen(function* () {
|
|
139
|
-
const { fresh } = yield* durations(retention);
|
|
140
|
-
const now = yield* Clock_exports.currentTimeMillis;
|
|
141
|
-
const values = yield* Effect_exports.forEach(
|
|
142
|
-
entries,
|
|
143
|
-
({ key, value }) => Effect_exports.gen(function* () {
|
|
144
|
-
return {
|
|
145
|
-
key: yield* keyOf(key),
|
|
146
|
-
entry: {
|
|
147
|
-
value,
|
|
148
|
-
version: crypto.randomUUID(),
|
|
149
|
-
freshUntil: now + fresh,
|
|
150
|
-
staleUntil: now + fresh
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
})
|
|
154
|
-
);
|
|
155
|
-
yield* transport({ operation: "write", entries: values });
|
|
156
|
-
}),
|
|
157
|
-
/** Revoke retained data and any loader's right to publish its in-flight result. */
|
|
158
|
-
invalidate: (key) => keyOf(key).pipe(
|
|
159
|
-
Effect_exports.flatMap((key2) => transport({ operation: "invalidate", key: key2 })),
|
|
160
|
-
Effect_exports.asVoid
|
|
161
|
-
),
|
|
162
|
-
/** Read fresh data, refresh stale data in the background, or wait for the lease owner. */
|
|
163
|
-
get: (options) => get(options, false),
|
|
164
|
-
/** Force one awaited refresh without removing the retained value. Concurrent refreshes share a load. */
|
|
165
|
-
revalidate: (options) => get(options, true)
|
|
166
|
-
};
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
export {
|
|
170
|
-
cacheKey,
|
|
171
|
-
makeCache
|
|
172
|
-
};
|