@fungi.computer/puffball 0.0.0-stage → 0.0.1
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/LICENSE +21 -0
- package/README.md +443 -2
- package/dist/app-api.d.ts +7 -0
- package/dist/app-api.js +61 -0
- package/dist/app-backend-binding-vocabulary.d.ts +299 -0
- package/dist/app-backend-binding-vocabulary.js +257 -0
- package/dist/app-backend-bindings.d.ts +21 -0
- package/dist/app-backend-bindings.js +47 -0
- package/dist/app-declaration.d.ts +46 -0
- package/dist/app-declaration.js +115 -0
- package/dist/app-event-facts.d.ts +40 -0
- package/dist/app-event-facts.js +28 -0
- package/dist/app-method-context.d.ts +109 -0
- package/dist/app-method-context.js +9 -0
- package/dist/app-method-runtime.d.ts +86 -0
- package/dist/app-method-runtime.js +122 -0
- package/dist/app-origin-paths.d.ts +6 -0
- package/dist/app-origin-paths.js +6 -0
- package/dist/app-vocabulary.d.ts +189 -0
- package/dist/app-vocabulary.js +103 -0
- package/dist/app.d.ts +379 -0
- package/dist/app.js +71 -0
- package/dist/artifact-dispositions.d.ts +115 -0
- package/dist/artifact-dispositions.js +234 -0
- package/dist/assets.d.ts +54 -0
- package/dist/assets.js +89 -0
- package/dist/backend.d.ts +41 -0
- package/dist/backend.js +29 -0
- package/dist/background-replay.d.ts +115 -0
- package/dist/background-replay.js +175 -0
- package/dist/buyer-references.d.ts +69 -0
- package/dist/buyer-references.js +154 -0
- package/dist/cloudflare-assets.d.ts +48 -0
- package/dist/cloudflare-assets.js +105 -0
- package/dist/cloudflare.d.ts +254 -0
- package/dist/cloudflare.js +1619 -0
- package/dist/effect.d.ts +73 -0
- package/dist/effect.js +325 -0
- package/dist/git-representation.d.ts +13 -0
- package/dist/git-representation.js +16 -0
- package/dist/inbox.d.ts +132 -0
- package/dist/inbox.js +81 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +85 -0
- package/dist/internal/app-description.d.ts +14 -0
- package/dist/internal/app-description.js +98 -0
- package/dist/internal/app-release-artifact-reader.d.ts +26 -0
- package/dist/internal/app-release-artifact-reader.js +1 -0
- package/dist/internal/app-release-contract.d.ts +540 -0
- package/dist/internal/app-release-contract.js +169 -0
- package/dist/internal/app-release-schema.d.ts +1676 -0
- package/dist/internal/app-release-schema.js +386 -0
- package/dist/internal/app-release-store.d.ts +47 -0
- package/dist/internal/app-release-store.js +1 -0
- package/dist/internal/background-sync.d.ts +7 -0
- package/dist/internal/background-sync.js +10 -0
- package/dist/internal/deterministic-memory-app-release-store.d.ts +14 -0
- package/dist/internal/deterministic-memory-app-release-store.js +319 -0
- package/dist/internal/failure.d.ts +2 -0
- package/dist/internal/failure.js +9 -0
- package/dist/internal/immutable-release-material.d.ts +3 -0
- package/dist/internal/immutable-release-material.js +13 -0
- package/dist/internal/promise-app-release-store-adapter.d.ts +9 -0
- package/dist/internal/promise-app-release-store-adapter.js +65 -0
- package/dist/internal/promise-artifact-reader-adapter.d.ts +9 -0
- package/dist/internal/promise-artifact-reader-adapter.js +18 -0
- package/dist/internal/public-route-sql.d.ts +10 -0
- package/dist/internal/public-route-sql.js +239 -0
- package/dist/internal/public-website-authority.d.ts +338 -0
- package/dist/internal/public-website-authority.js +50 -0
- package/dist/internal/public-website-delivery.d.ts +59 -0
- package/dist/internal/public-website-delivery.js +232 -0
- package/dist/internal/public-website-fetch.d.ts +8 -0
- package/dist/internal/public-website-fetch.js +54 -0
- package/dist/internal/release-transition-material.d.ts +3 -0
- package/dist/internal/release-transition-material.js +11 -0
- package/dist/internal/verified-artifact-snapshot.d.ts +41 -0
- package/dist/internal/verified-artifact-snapshot.js +91 -0
- package/dist/public-route-moderation.d.ts +83 -0
- package/dist/public-route-moderation.js +236 -0
- package/dist/public-route-policy.d.ts +51 -0
- package/dist/public-route-policy.js +88 -0
- package/dist/public-routes.d.ts +34 -0
- package/dist/public-routes.js +136 -0
- package/dist/publisher.d.ts +61 -0
- package/dist/publisher.js +16 -0
- package/dist/safety-takedown.d.ts +56 -0
- package/dist/safety-takedown.js +146 -0
- package/dist/seller-closure-notice.d.ts +14 -0
- package/dist/seller-closure-notice.js +14 -0
- package/dist/seller-closure.d.ts +15 -0
- package/dist/seller-closure.js +31 -0
- package/dist/testing.d.ts +8 -0
- package/dist/testing.js +47 -0
- package/docs/api/README.md +26 -0
- package/docs/api/app-backend-binding-vocabulary.md +276 -0
- package/docs/api/app-backend-bindings.md +141 -0
- package/docs/api/app-event-facts.md +110 -0
- package/docs/api/app-method-context.md +166 -0
- package/docs/api/app-method-runtime.md +330 -0
- package/docs/api/backend.md +108 -0
- package/docs/api/background-replay.md +516 -0
- package/docs/api/cloudflare.md +1044 -0
- package/docs/api/effect.md +2429 -0
- package/docs/api/git-representation.md +56 -0
- package/docs/api/inbox.md +289 -0
- package/docs/api/index.md +2868 -0
- package/docs/api/publisher.md +147 -0
- package/docs/api/testing.md +31 -0
- package/package.json +158 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AppReleaseCatalog, AppReleaseCatalogOptions } from "./internal/app-release-contract.js";
|
|
2
|
+
export * from "./internal/app-release-contract.js";
|
|
3
|
+
export { appCapabilityIds, appHandlers, appRoles, appStorageScopes, emptyAppDeclaration, isEmptyAppDeclaration, } from "./app-vocabulary.js";
|
|
4
|
+
export type { AppApi, AppBackendBinding, AppCapabilityId, AppDeclaration, AppDeclaredCommand, AppHandler, AppRole, AppStorageScope, AppStorageKey, } from "./app-vocabulary.js";
|
|
5
|
+
/** Parse an opaque Global App identifier. */
|
|
6
|
+
export declare const parseAppId: (input: unknown) => import("./internal/app-release-contract.js").AppId;
|
|
7
|
+
/** Parse a Cairn-issued App transition identity. */
|
|
8
|
+
export declare const parseAppTransitionId: (input: unknown) => import("./internal/app-release-contract.js").AppTransitionId;
|
|
9
|
+
/** Parse an opaque immutable Release identifier. */
|
|
10
|
+
export declare const parseReleaseId: (input: unknown) => import("./internal/app-release-contract.js").ReleaseId;
|
|
11
|
+
/** Parse an opaque anonymous public-Surface identifier. */
|
|
12
|
+
export declare const parsePublicSurfaceId: (input: unknown) => import("./internal/app-release-contract.js").PublicSurfaceId;
|
|
13
|
+
/** Publisher issues customer Surface identities through Cairn, never from slugs. */
|
|
14
|
+
export declare const issuePublicSurfaceId: () => import("./internal/app-release-contract.js").PublicSurfaceId;
|
|
15
|
+
/** Parse an opaque bounded artifact reference. */
|
|
16
|
+
export declare const parseArtifactRef: (input: unknown) => import("./internal/app-release-contract.js").ArtifactRef;
|
|
17
|
+
/** Parse a caller-provided idempotency key. */
|
|
18
|
+
export declare const parseIdempotencyKey: (input: unknown) => import("./internal/app-release-contract.js").IdempotencyKey;
|
|
19
|
+
/** Parse a pinned lowercase Git source revision. */
|
|
20
|
+
export declare const parseSourceRevision: (input: unknown) => import("./internal/app-release-contract.js").SourceRevision;
|
|
21
|
+
/** Parse a lowercase SHA-256 digest. */
|
|
22
|
+
export declare const parseSha256Digest: (input: unknown) => import("./internal/app-release-contract.js").Sha256Digest;
|
|
23
|
+
/** Parse a canonical local origin-relative stable route. */
|
|
24
|
+
export declare const parseStableRoute: (input: unknown) => import("./internal/app-release-contract.js").StableRoute;
|
|
25
|
+
/**
|
|
26
|
+
* Create the App Release catalog.
|
|
27
|
+
*
|
|
28
|
+
* The default Promise facade adapts each foreign port once before calling the
|
|
29
|
+
* same Effect-native core.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createAppReleaseCatalog(options: AppReleaseCatalogOptions): AppReleaseCatalog;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as Cause from "effect/Cause";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Exit from "effect/Exit";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
|
+
import { adaptPromiseAppReleaseStore, adaptPromiseArtifactReader, createAppReleaseCore, decodeAppId, decodeAppTransitionId, decodeArtifactRef, decodeIdempotencyKey, decodePublicSurfaceId, decodeReleaseId, decodeSha256Digest, decodeSourceRevision, decodeStableRoute, } from "./effect.js";
|
|
6
|
+
import { AppReleaseInputError } from "./internal/app-release-contract.js";
|
|
7
|
+
import { appSurfaceIdCodec } from "./internal/app-release-schema.js";
|
|
8
|
+
export * from "./internal/app-release-contract.js";
|
|
9
|
+
export { appCapabilityIds, appHandlers, appRoles, appStorageScopes, emptyAppDeclaration, isEmptyAppDeclaration, } from "./app-vocabulary.js";
|
|
10
|
+
/**
|
|
11
|
+
* Adapt one canonical decoder to the fixed public parser error boundary.
|
|
12
|
+
*
|
|
13
|
+
* The Effect-facing decoder remains the grammar authority; this root only
|
|
14
|
+
* projects its success value or replaces every rejection with a fixed error.
|
|
15
|
+
*/
|
|
16
|
+
function makeParser(parserName, decode) {
|
|
17
|
+
return (input) => {
|
|
18
|
+
const decoded = decode(input);
|
|
19
|
+
if (decoded._tag === "Success")
|
|
20
|
+
return decoded.success;
|
|
21
|
+
throw new AppReleaseInputError(parserName);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Parse an opaque Global App identifier. */
|
|
25
|
+
export const parseAppId = makeParser("AppId", decodeAppId);
|
|
26
|
+
/** Parse a Cairn-issued App transition identity. */
|
|
27
|
+
export const parseAppTransitionId = makeParser("AppTransitionId", decodeAppTransitionId);
|
|
28
|
+
/** Parse an opaque immutable Release identifier. */
|
|
29
|
+
export const parseReleaseId = makeParser("ReleaseId", decodeReleaseId);
|
|
30
|
+
/** Parse an opaque anonymous public-Surface identifier. */
|
|
31
|
+
export const parsePublicSurfaceId = makeParser("PublicSurfaceId", decodePublicSurfaceId);
|
|
32
|
+
/** Publisher issues customer Surface identities through Cairn, never from slugs. */
|
|
33
|
+
export const issuePublicSurfaceId = () => parsePublicSurfaceId(appSurfaceIdCodec.generate());
|
|
34
|
+
/** Parse an opaque bounded artifact reference. */
|
|
35
|
+
export const parseArtifactRef = makeParser("ArtifactRef", decodeArtifactRef);
|
|
36
|
+
/** Parse a caller-provided idempotency key. */
|
|
37
|
+
export const parseIdempotencyKey = makeParser("IdempotencyKey", decodeIdempotencyKey);
|
|
38
|
+
/** Parse a pinned lowercase Git source revision. */
|
|
39
|
+
export const parseSourceRevision = makeParser("SourceRevision", decodeSourceRevision);
|
|
40
|
+
/** Parse a lowercase SHA-256 digest. */
|
|
41
|
+
export const parseSha256Digest = makeParser("Sha256Digest", decodeSha256Digest);
|
|
42
|
+
/** Parse a canonical local origin-relative stable route. */
|
|
43
|
+
export const parseStableRoute = makeParser("StableRoute", decodeStableRoute);
|
|
44
|
+
/**
|
|
45
|
+
* Create the App Release catalog.
|
|
46
|
+
*
|
|
47
|
+
* The default Promise facade adapts each foreign port once before calling the
|
|
48
|
+
* same Effect-native core.
|
|
49
|
+
*/
|
|
50
|
+
export function createAppReleaseCatalog(options) {
|
|
51
|
+
const store = adaptPromiseAppReleaseStore(options.store);
|
|
52
|
+
const artifactReader = adaptPromiseArtifactReader(options.artifactReader);
|
|
53
|
+
const core = options.artifactPolicy === undefined
|
|
54
|
+
? createAppReleaseCore({ store, artifactReader })
|
|
55
|
+
: createAppReleaseCore({
|
|
56
|
+
store,
|
|
57
|
+
artifactReader,
|
|
58
|
+
artifactPolicy: options.artifactPolicy,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
createApp: (app) => runDefault(core.createApp(app)),
|
|
62
|
+
createRelease: (release) => runDefault(core.createRelease(release)),
|
|
63
|
+
verifyReleaseArtifact: (releaseId) => runDefault(core.verifyReleaseArtifact(releaseId)),
|
|
64
|
+
resolveEligibleReleaseArtifact: (releaseId) => runDefault(core.resolveEligibleReleaseArtifact(releaseId)),
|
|
65
|
+
resolveEligibleApp: (releaseId) => runDefault(core.resolveEligibleApp(releaseId)),
|
|
66
|
+
resolveEligibleAppMetadata: (releaseId) => runDefault(core.resolveEligibleAppMetadata(releaseId)),
|
|
67
|
+
resolvePublicSurfaceAuthority: (stableRoute) => runDefault(core.resolvePublicSurfaceAuthority(stableRoute)),
|
|
68
|
+
resolvePublicSurfaceAuthorityVersion: (stableRoute, releaseId) => runDefault(core.resolvePublicSurfaceAuthorityVersion(stableRoute, releaseId)),
|
|
69
|
+
createPublicSurface: (surface) => runDefault(core.createPublicSurface(surface)),
|
|
70
|
+
transition: (request) => runDefault(core.transition(request)),
|
|
71
|
+
resolvePublicAssetBuild: (stableRoute) => runDefault(core.resolvePublicAssetBuild(stableRoute)),
|
|
72
|
+
resolvePublicAssetBuildVersion: (stableRoute, releaseId) => runDefault(core.resolvePublicAssetBuildVersion(stableRoute, releaseId)),
|
|
73
|
+
resolvePublicWebsite: (stableRoute) => runDefault(core.resolvePublicWebsite(stableRoute)),
|
|
74
|
+
resolvePublicWebsiteVersion: (stableRoute, releaseId) => runDefault(core.resolvePublicWebsiteVersion(stableRoute, releaseId)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function runDefault(program) {
|
|
78
|
+
return Effect.runPromiseExit(program).then((exit) => {
|
|
79
|
+
if (Exit.isSuccess(exit))
|
|
80
|
+
return exit.value;
|
|
81
|
+
const failure = Option.getOrUndefined(Cause.findErrorOption(exit.cause));
|
|
82
|
+
const error = failure ?? Cause.squash(exit.cause);
|
|
83
|
+
return Promise.reject(error instanceof Error ? error : new Error(String(error)));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { type AppDescription } from "../app.js";
|
|
3
|
+
import type { AppReleaseArtifactReader } from "./app-release-artifact-reader.js";
|
|
4
|
+
import type { ArtifactVerificationIntent, VerifiedAppDescription } from "./app-release-contract.js";
|
|
5
|
+
import { type ArtifactSnapshotPolicy, type VerifiedArtifactSnapshot, type VerifiedArtifactSnapshotFailure } from "./verified-artifact-snapshot.js";
|
|
6
|
+
/** Resolve only the closed code children; ordinary use never loads the UI's asset tree. */
|
|
7
|
+
export declare function readAppDescription(reader: AppReleaseArtifactReader, root: VerifiedArtifactSnapshot, policy: ArtifactSnapshotPolicy, verification?: ArtifactVerificationIntent): Effect.Effect<AppDescription, VerifiedArtifactSnapshotFailure>;
|
|
8
|
+
/**
|
|
9
|
+
* Decode and normalize a verified App root for publication persistence.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readVerifiedAppDescription(reader: AppReleaseArtifactReader, root: VerifiedArtifactSnapshot, policy: ArtifactSnapshotPolicy, verification?: ArtifactVerificationIntent): Effect.Effect<{
|
|
12
|
+
readonly description: AppDescription;
|
|
13
|
+
readonly metadata: VerifiedAppDescription;
|
|
14
|
+
}, VerifiedArtifactSnapshotFailure>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { appBuildJsonSchema, appMediaType, } from "../app.js";
|
|
4
|
+
import { emptyAppDeclaration } from "../app-vocabulary.js";
|
|
5
|
+
import { backendJsonSchema, backendMediaType } from "../backend.js";
|
|
6
|
+
import { readVerifiedArtifactSnapshot, } from "./verified-artifact-snapshot.js";
|
|
7
|
+
/** Resolve only the closed code children; ordinary use never loads the UI's asset tree. */
|
|
8
|
+
export function readAppDescription(reader, root, policy, verification) {
|
|
9
|
+
return readVerifiedAppDescription(reader, root, policy, verification).pipe(Effect.map(({ description }) => description));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Decode and normalize a verified App root for publication persistence.
|
|
13
|
+
*/
|
|
14
|
+
export function readVerifiedAppDescription(reader, root, policy, verification) {
|
|
15
|
+
return Effect.gen(function* () {
|
|
16
|
+
if (root.mediaType !== appMediaType) {
|
|
17
|
+
return yield* Effect.fail(invalid());
|
|
18
|
+
}
|
|
19
|
+
const app = yield* Schema.decodeUnknownEffect(appBuildJsonSchema)(new TextDecoder().decode(root.bytes.copy()), { onExcessProperty: "error" }).pipe(Effect.mapError(invalid));
|
|
20
|
+
const ui = "ui" in app ? yield* readChild(app.ui) : null;
|
|
21
|
+
const backend = "backend" in app ? yield* readChild(app.backend) : null;
|
|
22
|
+
const description = yield* describe(ui, backend);
|
|
23
|
+
const metadataBackend = "backend" in app
|
|
24
|
+
? yield* describeVerifiedBackend(app.backend, description.backend)
|
|
25
|
+
: null;
|
|
26
|
+
return {
|
|
27
|
+
description,
|
|
28
|
+
metadata: {
|
|
29
|
+
format: "fungi-app-v1",
|
|
30
|
+
ui: "ui" in app ? referenceFromBuild(app.ui) : null,
|
|
31
|
+
backend: metadataBackend,
|
|
32
|
+
declaration: app.declaration ?? emptyAppDeclaration,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
function readChild(child) {
|
|
37
|
+
const expected = {
|
|
38
|
+
artifactRef: child.artifactRef,
|
|
39
|
+
expectedDigest: child.digest,
|
|
40
|
+
expectedObject: {
|
|
41
|
+
version: child.version,
|
|
42
|
+
byteLength: child.byteLength,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const input = verification === undefined ? expected : { ...expected, verification };
|
|
46
|
+
return readVerifiedArtifactSnapshot(reader, input, policy).pipe(Effect.flatMap((snapshot) => snapshot.mediaType === child.mediaType &&
|
|
47
|
+
snapshot.byteLength === child.byteLength
|
|
48
|
+
? Effect.succeed(snapshot)
|
|
49
|
+
: Effect.fail(invalid())));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function describeVerifiedBackend(build, backend) {
|
|
53
|
+
if (backend === null)
|
|
54
|
+
return Effect.fail(invalid());
|
|
55
|
+
return Effect.succeed({
|
|
56
|
+
artifact: referenceFromBuild(build),
|
|
57
|
+
profile: profileFromDescriptor(backend),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function referenceFromBuild(child) {
|
|
61
|
+
return {
|
|
62
|
+
artifactRef: child.artifactRef,
|
|
63
|
+
digest: child.digest,
|
|
64
|
+
mediaType: child.mediaType,
|
|
65
|
+
version: child.version,
|
|
66
|
+
byteLength: child.byteLength,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function profileFromDescriptor(backend) {
|
|
70
|
+
const descriptor = backend.descriptor;
|
|
71
|
+
return {
|
|
72
|
+
runtime: descriptor.runtime,
|
|
73
|
+
compatibilityDate: descriptor.compatibilityDate,
|
|
74
|
+
exportName: descriptor.exportName,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function describe(root, backend) {
|
|
78
|
+
return Effect.gen(function* () {
|
|
79
|
+
const ui = root !== null &&
|
|
80
|
+
(root.mediaType === "text/html; charset=utf-8" ||
|
|
81
|
+
root.mediaType === "application/vnd.fungi.app-assets+json")
|
|
82
|
+
? { ...root, mediaType: root.mediaType }
|
|
83
|
+
: null;
|
|
84
|
+
const code = root?.mediaType === backendMediaType ? root : backend;
|
|
85
|
+
const descriptor = code === null
|
|
86
|
+
? null
|
|
87
|
+
: yield* Schema.decodeUnknownEffect(backendJsonSchema)(new TextDecoder().decode(code.bytes.copy()), { onExcessProperty: "error" }).pipe(Effect.mapError(invalid));
|
|
88
|
+
return {
|
|
89
|
+
ui,
|
|
90
|
+
backend: code !== null && descriptor !== null
|
|
91
|
+
? { digest: code.digest, descriptor }
|
|
92
|
+
: null,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function invalid() {
|
|
97
|
+
return { kind: "invalid-snapshot" };
|
|
98
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import type { ArtifactRef, ArtifactVerificationIntent, Sha256Digest } from "./app-release-contract.js";
|
|
3
|
+
/** Closed infrastructure failure at the hostile artifact-reader boundary. */
|
|
4
|
+
export type AppReleaseArtifactReaderUnavailable = {
|
|
5
|
+
readonly kind: "unavailable";
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Effect-native artifact reader port.
|
|
9
|
+
*
|
|
10
|
+
* A reader result is hostile until the App Release core decodes it through its
|
|
11
|
+
* canonical schema. This port owns the only direct unknown success value.
|
|
12
|
+
*/
|
|
13
|
+
export type AppReleaseArtifactReader = {
|
|
14
|
+
/** Resolve one stored artifact reference for its expected immutable digest. */
|
|
15
|
+
read(input: {
|
|
16
|
+
readonly artifactRef: ArtifactRef;
|
|
17
|
+
readonly expectedDigest: Sha256Digest;
|
|
18
|
+
/** Native version and size of a child named by a verified App root. */
|
|
19
|
+
readonly expectedObject?: {
|
|
20
|
+
readonly version: string;
|
|
21
|
+
readonly byteLength: number;
|
|
22
|
+
};
|
|
23
|
+
/** Publication additionally verifies every object named by an asset manifest. */
|
|
24
|
+
readonly verification?: ArtifactVerificationIntent;
|
|
25
|
+
}): Effect.Effect<unknown, AppReleaseArtifactReaderUnavailable>;
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|