@aotter/mantle-cloudflare 0.1.0-alpha.16 → 0.1.0-alpha.17
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 +39 -1
- package/dist/auth/createAuth.d.ts +12 -11
- package/dist/auth/createAuth.d.ts.map +1 -1
- package/dist/auth/createAuth.js +158 -16
- package/dist/auth/createAuth.js.map +1 -1
- package/dist/bindings/KvSiteConfigRepository.d.ts +44 -0
- package/dist/bindings/KvSiteConfigRepository.d.ts.map +1 -0
- package/dist/bindings/KvSiteConfigRepository.js +286 -0
- package/dist/bindings/KvSiteConfigRepository.js.map +1 -0
- package/dist/bindings/R2MediaStorage.d.ts +2 -3
- package/dist/bindings/R2MediaStorage.d.ts.map +1 -1
- package/dist/bindings/R2MediaStorage.js +59 -42
- package/dist/bindings/R2MediaStorage.js.map +1 -1
- package/dist/bindings/conventionalBindings.d.ts +2 -0
- package/dist/bindings/conventionalBindings.d.ts.map +1 -1
- package/dist/bindings/conventionalBindings.js +3 -0
- package/dist/bindings/conventionalBindings.js.map +1 -1
- package/dist/bindings/index.d.ts +1 -0
- package/dist/bindings/index.d.ts.map +1 -1
- package/dist/bindings/index.js +1 -0
- package/dist/bindings/index.js.map +1 -1
- package/dist/mount/bootRuntimeOnce.d.ts +3 -0
- package/dist/mount/bootRuntimeOnce.d.ts.map +1 -1
- package/dist/mount/bootRuntimeOnce.js +41 -27
- package/dist/mount/bootRuntimeOnce.js.map +1 -1
- package/dist/mount/cmsConfig.d.ts +5 -0
- package/dist/mount/cmsConfig.d.ts.map +1 -1
- package/dist/mount/mountMcp.d.ts.map +1 -1
- package/dist/mount/mountMcp.js +76 -60
- package/dist/mount/mountMcp.js.map +1 -1
- package/dist/mount/mountPublicRoutes.d.ts.map +1 -1
- package/dist/mount/mountPublicRoutes.js +67 -58
- package/dist/mount/mountPublicRoutes.js.map +1 -1
- package/dist/mount/mountRuntimeEndpoints.d.ts.map +1 -1
- package/dist/mount/mountRuntimeEndpoints.js +3 -1
- package/dist/mount/mountRuntimeEndpoints.js.map +1 -1
- package/dist/oauth/index.d.ts +1 -1
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +1 -1
- package/dist/oauth/index.js.map +1 -1
- package/dist/requestDiagnostics.d.ts +53 -0
- package/dist/requestDiagnostics.d.ts.map +1 -0
- package/dist/requestDiagnostics.js +32 -0
- package/dist/requestDiagnostics.js.map +1 -0
- package/dist/testing.d.ts +19 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +263 -0
- package/dist/testing.js.map +1 -0
- package/dist/worker/createMantleWorker.d.ts +3 -0
- package/dist/worker/createMantleWorker.d.ts.map +1 -1
- package/dist/worker/createMantleWorker.js +46 -13
- package/dist/worker/createMantleWorker.js.map +1 -1
- package/package.json +18 -11
- package/dist/auth/rejectCrossOriginMutation.d.ts +0 -2
- package/dist/auth/rejectCrossOriginMutation.d.ts.map +0 -1
- package/dist/auth/rejectCrossOriginMutation.js +0 -15
- package/dist/auth/rejectCrossOriginMutation.js.map +0 -1
- package/dist/oauth/consentHtml.d.ts +0 -15
- package/dist/oauth/consentHtml.d.ts.map +0 -1
- package/dist/oauth/consentHtml.js +0 -91
- package/dist/oauth/consentHtml.js.map +0 -1
- package/dist/oauth/mountOAuth.d.ts +0 -9
- package/dist/oauth/mountOAuth.d.ts.map +0 -1
- package/dist/oauth/mountOAuth.js +0 -37
- package/dist/oauth/mountOAuth.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type MediaPurposePolicy, type SiteConfig, type SiteDefaults } from "@aotter/mantle-spec";
|
|
2
|
+
import type { SiteConfigRepository, UpdateEditableSiteConfigArgs } from "@aotter/mantle-runtime";
|
|
3
|
+
export type McpCatalogSiteConfig = Pick<SiteConfig, "origin" | "brand" | "description" | "icons" | "media">;
|
|
4
|
+
export interface McpCatalogKvBinding {
|
|
5
|
+
readonly namespace: KVNamespace;
|
|
6
|
+
/** Stable deployment-owned scope. Never derive this from a request. */
|
|
7
|
+
readonly scope: string;
|
|
8
|
+
}
|
|
9
|
+
export interface McpCatalogSiteConfigReader {
|
|
10
|
+
/** Resolve caller-independent catalog data after the transport auth gate. */
|
|
11
|
+
loadCatalogSite(runtime: object): Promise<McpCatalogSiteConfig>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Cloudflare-owned write-through decorator for MCP catalog configuration.
|
|
15
|
+
* The delegate remains canonical: ordinary repository reads always hit D1,
|
|
16
|
+
* while only the caller-independent MCP projection is stored in KV.
|
|
17
|
+
*/
|
|
18
|
+
export declare class KvSiteConfigRepository implements SiteConfigRepository, McpCatalogSiteConfigReader {
|
|
19
|
+
private readonly canonical;
|
|
20
|
+
private readonly binding;
|
|
21
|
+
readonly key: string;
|
|
22
|
+
private readonly inFlight;
|
|
23
|
+
private generation;
|
|
24
|
+
private lastKnownSnapshot;
|
|
25
|
+
private operationTail;
|
|
26
|
+
private putFailureCount;
|
|
27
|
+
private putBackoffUntil;
|
|
28
|
+
private readonly diagnosticCounts;
|
|
29
|
+
constructor(canonical: SiteConfigRepository, binding: McpCatalogKvBinding);
|
|
30
|
+
load(): Promise<SiteConfig>;
|
|
31
|
+
readLocales(): Promise<readonly string[]>;
|
|
32
|
+
readMediaPurposes(): Promise<readonly MediaPurposePolicy[]>;
|
|
33
|
+
seed(defaults: SiteDefaults | undefined): Promise<void>;
|
|
34
|
+
updateEditable(values: UpdateEditableSiteConfigArgs): Promise<void>;
|
|
35
|
+
loadCatalogSite(runtime: object): Promise<McpCatalogSiteConfig>;
|
|
36
|
+
private readCatalogSite;
|
|
37
|
+
private repairCatalogSite;
|
|
38
|
+
private publishAfterCommittedWrite;
|
|
39
|
+
private loadCanonicalSnapshot;
|
|
40
|
+
private putSnapshot;
|
|
41
|
+
private exclusive;
|
|
42
|
+
private diagnostic;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=KvSiteConfigRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KvSiteConfigRepository.d.ts","sourceRoot":"","sources":["../../src/bindings/KvSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAWhC,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,UAAU,EACV,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CACvD,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACjE;AA2CD;;;;GAIG;AACH,qBAAa,sBACX,YAAW,oBAAoB,EAAE,0BAA0B;IAWzD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;gBAG3C,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,mBAAmB;IAU/C,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAI3B,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAIzC,iBAAiB,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC;IAIrD,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,cAAc,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAuBjD,eAAe;IAqB7B,OAAO,CAAC,iBAAiB;YAWX,0BAA0B;YAa1B,qBAAqB;YAerB,WAAW;IAiCzB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,UAAU;CAgBnB"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { assertSiteDefaultsCanonical, } from "@aotter/mantle-spec";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { requestDiagnosticContext } from "../requestDiagnostics.js";
|
|
4
|
+
const SNAPSHOT_VERSION = 1;
|
|
5
|
+
const MAX_SNAPSHOT_AGE_MS = 3_600_000;
|
|
6
|
+
const MAX_FUTURE_SKEW_MS = 60_000;
|
|
7
|
+
const MAX_ENVELOPE_BYTES = 64 * 1024;
|
|
8
|
+
const MAX_PUT_BACKOFF_MS = 60_000;
|
|
9
|
+
const SCOPE_PATTERN = /^[A-Za-z0-9_-]{1,64}$/u;
|
|
10
|
+
const snapshotSchema = z.strictObject({
|
|
11
|
+
version: z.literal(SNAPSHOT_VERSION),
|
|
12
|
+
scope: z.string(),
|
|
13
|
+
observedAt: z.number().int().nonnegative(),
|
|
14
|
+
repairAfter: z.number().int().nonnegative(),
|
|
15
|
+
contentHash: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
16
|
+
site: z.strictObject({
|
|
17
|
+
origin: z.string(),
|
|
18
|
+
brand: z.string(),
|
|
19
|
+
description: z.string(),
|
|
20
|
+
icons: z.array(z.strictObject({
|
|
21
|
+
src: z.string(),
|
|
22
|
+
mimeType: z.enum(["image/png", "image/jpeg", "image/svg+xml", "image/webp"]).optional(),
|
|
23
|
+
sizes: z.array(z.string()).optional(),
|
|
24
|
+
theme: z.enum(["light", "dark"]).optional(),
|
|
25
|
+
})),
|
|
26
|
+
media: z.strictObject({
|
|
27
|
+
purposes: z.array(z.strictObject({
|
|
28
|
+
name: z.string(),
|
|
29
|
+
required: z.array(z.string()),
|
|
30
|
+
maxBytes: z.record(z.string(), z.number().positive()),
|
|
31
|
+
})),
|
|
32
|
+
}),
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Cloudflare-owned write-through decorator for MCP catalog configuration.
|
|
37
|
+
* The delegate remains canonical: ordinary repository reads always hit D1,
|
|
38
|
+
* while only the caller-independent MCP projection is stored in KV.
|
|
39
|
+
*/
|
|
40
|
+
export class KvSiteConfigRepository {
|
|
41
|
+
canonical;
|
|
42
|
+
binding;
|
|
43
|
+
key;
|
|
44
|
+
inFlight = new WeakMap();
|
|
45
|
+
generation = 0;
|
|
46
|
+
lastKnownSnapshot;
|
|
47
|
+
operationTail = Promise.resolve();
|
|
48
|
+
putFailureCount = 0;
|
|
49
|
+
putBackoffUntil = 0;
|
|
50
|
+
diagnosticCounts = new Map();
|
|
51
|
+
constructor(canonical, binding) {
|
|
52
|
+
this.canonical = canonical;
|
|
53
|
+
this.binding = binding;
|
|
54
|
+
if (!SCOPE_PATTERN.test(binding.scope)) {
|
|
55
|
+
throw new Error("Mantle MCP catalog KV scope must contain 1-64 ASCII letters, digits, '_' or '-'.");
|
|
56
|
+
}
|
|
57
|
+
this.key = `mantle:site-config:v1:${binding.scope}:mcp`;
|
|
58
|
+
}
|
|
59
|
+
load() {
|
|
60
|
+
return this.canonical.load();
|
|
61
|
+
}
|
|
62
|
+
readLocales() {
|
|
63
|
+
return this.canonical.readLocales();
|
|
64
|
+
}
|
|
65
|
+
readMediaPurposes() {
|
|
66
|
+
return this.canonical.readMediaPurposes();
|
|
67
|
+
}
|
|
68
|
+
async seed(defaults) {
|
|
69
|
+
// Invalidate pre-mutation reads now, and reads started during the write
|
|
70
|
+
// again after commit. Neither may repopulate the local snapshot later.
|
|
71
|
+
this.generation += 1;
|
|
72
|
+
await this.exclusive(async () => {
|
|
73
|
+
await this.canonical.seed(defaults);
|
|
74
|
+
this.generation += 1;
|
|
75
|
+
await this.publishAfterCommittedWrite("seed");
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async updateEditable(values) {
|
|
79
|
+
if (!this.canonical.updateEditable) {
|
|
80
|
+
throw new Error("SiteConfigRepository.updateEditable is unavailable");
|
|
81
|
+
}
|
|
82
|
+
this.generation += 1;
|
|
83
|
+
await this.exclusive(async () => {
|
|
84
|
+
await this.canonical.updateEditable(values);
|
|
85
|
+
this.generation += 1;
|
|
86
|
+
await this.publishAfterCommittedWrite("update");
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
loadCatalogSite(runtime) {
|
|
90
|
+
const generation = this.generation;
|
|
91
|
+
let flight = this.inFlight.get(runtime);
|
|
92
|
+
const record = requestDiagnosticContext.getStore();
|
|
93
|
+
const sharedWait = flight?.generation === generation;
|
|
94
|
+
const started = record && sharedWait ? performance.now() : null;
|
|
95
|
+
if (!sharedWait) {
|
|
96
|
+
const observation = { source: "not-reached" };
|
|
97
|
+
const pending = this.readCatalogSite(generation, observation).finally(() => {
|
|
98
|
+
if (this.inFlight.get(runtime)?.promise === pending)
|
|
99
|
+
this.inFlight.delete(runtime);
|
|
100
|
+
});
|
|
101
|
+
flight = { generation, observation, promise: pending };
|
|
102
|
+
this.inFlight.set(runtime, flight);
|
|
103
|
+
}
|
|
104
|
+
const selected = flight;
|
|
105
|
+
if (!record)
|
|
106
|
+
return selected.promise;
|
|
107
|
+
return selected.promise.finally(() => {
|
|
108
|
+
record.catalog.source = selected.observation.source;
|
|
109
|
+
record.catalog.sharedWait ||= sharedWait;
|
|
110
|
+
if (started !== null)
|
|
111
|
+
record.catalog.waitMs = (record.catalog.waitMs ?? 0) + performance.now() - started;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async readCatalogSite(generation, observation) {
|
|
115
|
+
let raw = null;
|
|
116
|
+
let kvFailed = false;
|
|
117
|
+
try {
|
|
118
|
+
raw = await this.binding.namespace.get(this.key, "text");
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
kvFailed = true;
|
|
122
|
+
this.diagnostic("get-failed", error);
|
|
123
|
+
}
|
|
124
|
+
if (raw !== null) {
|
|
125
|
+
const snapshot = await parseSnapshot(raw, this.binding.scope, Date.now());
|
|
126
|
+
if (snapshot && generation === this.generation) {
|
|
127
|
+
this.lastKnownSnapshot = snapshot;
|
|
128
|
+
observation.source = "kv-hit";
|
|
129
|
+
return snapshot.site;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
observation.source = kvFailed ? "d1-kv-error" : raw === null ? "d1-miss" : "d1-repair";
|
|
133
|
+
return this.repairCatalogSite();
|
|
134
|
+
}
|
|
135
|
+
repairCatalogSite() {
|
|
136
|
+
// Serialize miss fill with local setting mutations. Every publication
|
|
137
|
+
// reloads canonical state inside the same critical section, so an older
|
|
138
|
+
// local miss cannot overwrite a newer local write-through publication.
|
|
139
|
+
return this.exclusive(async () => {
|
|
140
|
+
const snapshot = await this.loadCanonicalSnapshot();
|
|
141
|
+
await this.putSnapshot(snapshot, true);
|
|
142
|
+
return snapshot.site;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async publishAfterCommittedWrite(reason) {
|
|
146
|
+
const record = requestDiagnosticContext.getStore();
|
|
147
|
+
if (reason === "seed" && record)
|
|
148
|
+
record.catalog.bootPublications++;
|
|
149
|
+
try {
|
|
150
|
+
const snapshot = await this.loadCanonicalSnapshot();
|
|
151
|
+
await this.putSnapshot(snapshot);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// D1 already committed. Derived-cache repair must never turn a saved
|
|
155
|
+
// setting into a misleading failure or suppress the public-cache purge.
|
|
156
|
+
this.diagnostic(`${reason}-publication-failed`, error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async loadCanonicalSnapshot() {
|
|
160
|
+
// Anchor freshness before the canonical read. A delayed load cannot gain
|
|
161
|
+
// a fresh lifetime merely because serialization or KV put completed later.
|
|
162
|
+
const observedAt = Date.now();
|
|
163
|
+
const site = normalizeCatalogSite(await this.canonical.load());
|
|
164
|
+
return {
|
|
165
|
+
version: SNAPSHOT_VERSION,
|
|
166
|
+
scope: this.binding.scope,
|
|
167
|
+
observedAt,
|
|
168
|
+
repairAfter: observedAt + MAX_SNAPSHOT_AGE_MS,
|
|
169
|
+
contentHash: await contentHash(site),
|
|
170
|
+
site,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async putSnapshot(snapshot, force = false) {
|
|
174
|
+
const now = Date.now();
|
|
175
|
+
// KV requires at least 60 seconds of remaining lifetime. Do not extend
|
|
176
|
+
// an old observation just to satisfy the platform's expiration minimum.
|
|
177
|
+
if (snapshot.repairAfter < now + 60_000 || now < this.putBackoffUntil)
|
|
178
|
+
return;
|
|
179
|
+
if (!force
|
|
180
|
+
&& this.lastKnownSnapshot?.contentHash === snapshot.contentHash
|
|
181
|
+
&& isSnapshotFresh(this.lastKnownSnapshot, now))
|
|
182
|
+
return;
|
|
183
|
+
const value = JSON.stringify(snapshot);
|
|
184
|
+
const bytes = utf8Bytes(value);
|
|
185
|
+
if (bytes > MAX_ENVELOPE_BYTES) {
|
|
186
|
+
this.diagnostic("oversized", { bytes, limit: MAX_ENVELOPE_BYTES });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
await this.binding.namespace.put(this.key, value, {
|
|
191
|
+
expiration: Math.ceil(snapshot.repairAfter / 1000),
|
|
192
|
+
});
|
|
193
|
+
this.lastKnownSnapshot = snapshot;
|
|
194
|
+
this.putFailureCount = 0;
|
|
195
|
+
this.putBackoffUntil = 0;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.putFailureCount += 1;
|
|
199
|
+
this.putBackoffUntil = now + Math.min(MAX_PUT_BACKOFF_MS, 1_000 * (2 ** Math.min(this.putFailureCount - 1, 6)));
|
|
200
|
+
this.diagnostic("put-failed", error);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exclusive(operation) {
|
|
204
|
+
const result = this.operationTail.then(operation, operation);
|
|
205
|
+
this.operationTail = result.then(() => undefined, () => undefined);
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
diagnostic(kind, detail) {
|
|
209
|
+
const count = (this.diagnosticCounts.get(kind) ?? 0) + 1;
|
|
210
|
+
this.diagnosticCounts.set(kind, count);
|
|
211
|
+
// Bound repeated outage logs to the first occurrence and powers of two.
|
|
212
|
+
if (count !== 1 && (count & (count - 1)) !== 0)
|
|
213
|
+
return;
|
|
214
|
+
const safeDetail = isRecord(detail) && typeof detail["bytes"] === "number"
|
|
215
|
+
? { bytes: detail["bytes"], limit: detail["limit"] }
|
|
216
|
+
: detail instanceof Error
|
|
217
|
+
? { name: detail.name }
|
|
218
|
+
: undefined;
|
|
219
|
+
console.warn("[mantle] MCP catalog KV diagnostic", {
|
|
220
|
+
kind,
|
|
221
|
+
count,
|
|
222
|
+
...(safeDetail ? { detail: safeDetail } : {}),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function normalizeCatalogSite(site) {
|
|
227
|
+
return {
|
|
228
|
+
origin: site.origin,
|
|
229
|
+
brand: site.brand,
|
|
230
|
+
description: site.description,
|
|
231
|
+
icons: site.icons.map(normalizeIcon),
|
|
232
|
+
media: {
|
|
233
|
+
purposes: site.media.purposes.map((purpose) => ({
|
|
234
|
+
name: purpose.name,
|
|
235
|
+
required: [...purpose.required],
|
|
236
|
+
maxBytes: Object.fromEntries(Object.entries(purpose.maxBytes).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)),
|
|
237
|
+
})),
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function normalizeIcon(icon) {
|
|
242
|
+
return {
|
|
243
|
+
src: icon.src,
|
|
244
|
+
...(icon.mimeType ? { mimeType: icon.mimeType } : {}),
|
|
245
|
+
...(icon.sizes ? { sizes: [...icon.sizes] } : {}),
|
|
246
|
+
...(icon.theme ? { theme: icon.theme } : {}),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
async function parseSnapshot(raw, scope, now) {
|
|
250
|
+
if (utf8Bytes(raw) > MAX_ENVELOPE_BYTES)
|
|
251
|
+
return null;
|
|
252
|
+
let snapshot;
|
|
253
|
+
try {
|
|
254
|
+
const parsed = snapshotSchema.safeParse(JSON.parse(raw));
|
|
255
|
+
if (!parsed.success)
|
|
256
|
+
return null;
|
|
257
|
+
snapshot = parsed.data;
|
|
258
|
+
assertSiteDefaultsCanonical(snapshot.site);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
if (snapshot.scope !== scope || !isSnapshotFresh(snapshot, now))
|
|
264
|
+
return null;
|
|
265
|
+
const site = normalizeCatalogSite(snapshot.site);
|
|
266
|
+
if (await contentHash(site) !== snapshot.contentHash)
|
|
267
|
+
return null;
|
|
268
|
+
return { ...snapshot, site };
|
|
269
|
+
}
|
|
270
|
+
function isSnapshotFresh(value, now) {
|
|
271
|
+
return value.observedAt <= now + MAX_FUTURE_SKEW_MS
|
|
272
|
+
&& value.repairAfter > value.observedAt
|
|
273
|
+
&& value.repairAfter - value.observedAt <= MAX_SNAPSHOT_AGE_MS
|
|
274
|
+
&& value.repairAfter > now;
|
|
275
|
+
}
|
|
276
|
+
async function contentHash(site) {
|
|
277
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(JSON.stringify(site)));
|
|
278
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
279
|
+
}
|
|
280
|
+
function utf8Bytes(value) {
|
|
281
|
+
return new TextEncoder().encode(value).byteLength;
|
|
282
|
+
}
|
|
283
|
+
function isRecord(value) {
|
|
284
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=KvSiteConfigRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KvSiteConfigRepository.js","sourceRoot":"","sources":["../../src/bindings/KvSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAK5B,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAsB,MAAM,0BAA0B,CAAC;AAExF,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,mBAAmB,GAAG,SAAS,CAAC;AACtC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AA2B/C,MAAM,cAAc,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;YAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;YACvF,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACrC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC5C,CAAC,CAAC;QACH,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;aACtD,CAAC,CAAC;SACJ,CAAC;KACH,CAAC;CACH,CAAC,CAAC;AAQH;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IAYd;IACA;IAXV,GAAG,CAAS;IACJ,QAAQ,GAAG,IAAI,OAAO,EAA+B,CAAC;IAC/D,UAAU,GAAG,CAAC,CAAC;IACf,iBAAiB,CAAgC;IACjD,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,eAAe,GAAG,CAAC,CAAC;IACpB,eAAe,GAAG,CAAC,CAAC;IACX,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9D,YACmB,SAA+B,EAC/B,OAA4B;QAD5B,cAAS,GAAT,SAAS,CAAsB;QAC/B,YAAO,GAAP,OAAO,CAAqB;QAE7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,yBAAyB,OAAO,CAAC,KAAK,MAAM,CAAC;IAC1D,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAkC;QAC3C,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAoC;QACvD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,CAAC,SAAS,CAAC,cAAe,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,OAAe;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,KAAK,UAAU,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,WAAW,GAA8B,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAO,CAAC;QACzB,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAC;QACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC;YACzC,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAC3G,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,WAAsC;QACtF,IAAI,GAAG,GAAkB,IAAI,CAAC;QAC9B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1E,IAAI,QAAQ,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC/C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;gBAClC,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QACD,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;QACvF,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAEO,iBAAiB;QACvB,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,MAAyB;QAChE,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,qBAAqB,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,UAAU;YACV,WAAW,EAAE,UAAU,GAAG,mBAAmB;YAC7C,WAAW,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC;YACpC,IAAI;SACL,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAA2B,EAAE,KAAK,GAAG,KAAK;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,QAAQ,CAAC,WAAW,GAAG,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe;YAAE,OAAO;QAC9E,IACE,CAAC,KAAK;eACH,IAAI,CAAC,iBAAiB,EAAE,WAAW,KAAK,QAAQ,CAAC,WAAW;eAC5D,eAAe,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC;YAC/C,OAAO;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;gBAChD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;aACnD,CAAC,CAAC;YACH,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;YAClC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CACnC,kBAAkB,EAClB,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CACrD,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,SAAS,CAAI,SAA2B;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,UAAU,CAAC,IAAY,EAAE,MAAe;QAC9C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,wEAAwE;QACxE,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ;YACxE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;YACpD,CAAC,CAAC,MAAM,YAAY,KAAK;gBACvB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;gBACvB,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE;YACjD,IAAI;YACJ,KAAK;YACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,IAA0B;IACtD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;QACpC,KAAK,EAAE;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAC1B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAChF;aACF,CAAC,CAAC;SACJ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,KAAa,EACb,GAAW;IAEX,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,QAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QACvB,2BAA2B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CACtB,KAA4D,EAC5D,GAAW;IAEX,OAAO,KAAK,CAAC,UAAU,IAAI,GAAG,GAAG,kBAAkB;WAC9C,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU;WACpC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,IAAI,mBAAmB;WAC3D,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAA0B;IACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AACpD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -28,15 +28,14 @@ import { type CommitUploadArgs, type CreateUploadArgs, type CreateUploadResult,
|
|
|
28
28
|
* # Multi-variant (#272)
|
|
29
29
|
*
|
|
30
30
|
* `createUpload` produces one presigned PUT URL per declared variant;
|
|
31
|
-
* `commitUpload`
|
|
31
|
+
* `commitUpload` verifies and streams every object through a metadata rewrite. Storage keys are scoped
|
|
32
32
|
* under a shared `<uploadGroupId>/` prefix so operators can eyeball
|
|
33
33
|
* the variant set in R2 dashboards, and the orphan sweeper (#254)
|
|
34
34
|
* can identify partially-committed groups by listing the prefix.
|
|
35
35
|
*
|
|
36
36
|
* Optimization runs agent-side in the MCP client's runtime. The
|
|
37
37
|
* Worker never decodes / re-encodes bytes — it only verifies content-
|
|
38
|
-
* type + size
|
|
39
|
-
* (`bucket.get` + `httpMetadata`).
|
|
38
|
+
* type + size from `bucket.get` before streaming the metadata-rewrite PUT.
|
|
40
39
|
*
|
|
41
40
|
* # Future: private bucket adapter
|
|
42
41
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"R2MediaStorage.d.ts","sourceRoot":"","sources":["../../src/bindings/R2MediaStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EAGlB,MAAM,wBAAwB,CAAC;AAEhC
|
|
1
|
+
{"version":3,"file":"R2MediaStorage.d.ts","sourceRoot":"","sources":["../../src/bindings/R2MediaStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EAGlB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,cAAe,YAAW,YAAY;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB;;mDAE+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAK3B;;;;;;sEAMkE;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAjBL,MAAM,EAAE,QAAQ,EAChB,EAAE,EAAE,SAAS;IAC9B;;mDAE+C;IAC9B,UAAU,EAAE,MAAM;IACnC;;6CAEyC;IACzC,UAAU,EAAE,MAAM;IAClB;;;;;;sEAMkE;IACjD,KAAK,GAAE,WAAiC;IAgB3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAE9B,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwCjE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IA2DzD,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAK3C,sBAAsB;IAyDpC;;;;;;;;2CAQuC;IACvC,OAAO,CAAC,sBAAsB;CAY/B"}
|
|
@@ -28,15 +28,14 @@ import { RandomUuidGenerator, extensionForMime, } from "@aotter/mantle-runtime";
|
|
|
28
28
|
* # Multi-variant (#272)
|
|
29
29
|
*
|
|
30
30
|
* `createUpload` produces one presigned PUT URL per declared variant;
|
|
31
|
-
* `commitUpload`
|
|
31
|
+
* `commitUpload` verifies and streams every object through a metadata rewrite. Storage keys are scoped
|
|
32
32
|
* under a shared `<uploadGroupId>/` prefix so operators can eyeball
|
|
33
33
|
* the variant set in R2 dashboards, and the orphan sweeper (#254)
|
|
34
34
|
* can identify partially-committed groups by listing the prefix.
|
|
35
35
|
*
|
|
36
36
|
* Optimization runs agent-side in the MCP client's runtime. The
|
|
37
37
|
* Worker never decodes / re-encodes bytes — it only verifies content-
|
|
38
|
-
* type + size
|
|
39
|
-
* (`bucket.get` + `httpMetadata`).
|
|
38
|
+
* type + size from `bucket.get` before streaming the metadata-rewrite PUT.
|
|
40
39
|
*
|
|
41
40
|
* # Future: private bucket adapter
|
|
42
41
|
*
|
|
@@ -123,16 +122,12 @@ export class R2MediaStorage {
|
|
|
123
122
|
};
|
|
124
123
|
}
|
|
125
124
|
async commitUpload(args) {
|
|
126
|
-
const variants = [];
|
|
127
|
-
for (const spec of args.variants) {
|
|
128
|
-
variants.push(await this.verifyAndCommitVariant(args, spec));
|
|
129
|
-
}
|
|
130
125
|
// Enforce the asset-shape invariant the renderer depends on. The
|
|
131
126
|
// use case already validated this at create time; this is a
|
|
132
127
|
// belt-and-suspenders check at the adapter-side commit path.
|
|
133
128
|
// Exactly one primary, no duplicated (mime, role) pair (the latter
|
|
134
129
|
// would have already collided on storage key in createUpload).
|
|
135
|
-
const primaries = variants.filter((v) => v.role === "primary");
|
|
130
|
+
const primaries = args.variants.filter((v) => v.role === "primary");
|
|
136
131
|
if (primaries.length !== 1) {
|
|
137
132
|
throw new DiagnosticError(makeDiagnostic({
|
|
138
133
|
code: "MEDIA_VARIANTS_INCOMPLETE",
|
|
@@ -140,11 +135,11 @@ export class R2MediaStorage {
|
|
|
140
135
|
severity: "error",
|
|
141
136
|
path: "adapter/R2MediaStorage/commitUpload",
|
|
142
137
|
expected: "exactly one variant with role='primary'",
|
|
143
|
-
value: variants.map((v) => v.role).join(","),
|
|
138
|
+
value: args.variants.map((v) => v.role).join(","),
|
|
144
139
|
}));
|
|
145
140
|
}
|
|
146
141
|
const seenKey = new Set();
|
|
147
|
-
for (const v of variants) {
|
|
142
|
+
for (const v of args.variants) {
|
|
148
143
|
const key = `${v.mimeType}/${v.role}`;
|
|
149
144
|
if (seenKey.has(key)) {
|
|
150
145
|
throw new DiagnosticError(makeDiagnostic({
|
|
@@ -158,6 +153,18 @@ export class R2MediaStorage {
|
|
|
158
153
|
}
|
|
159
154
|
seenKey.add(key);
|
|
160
155
|
}
|
|
156
|
+
const variants = [];
|
|
157
|
+
// At most three GET streams and three corresponding PUTs per invocation.
|
|
158
|
+
// Settle the whole batch before returning an error or starting another.
|
|
159
|
+
for (let offset = 0; offset < args.variants.length; offset += 3) {
|
|
160
|
+
const results = await Promise.allSettled(args.variants.slice(offset, offset + 3)
|
|
161
|
+
.map((spec) => this.verifyAndCommitVariant(args, spec)));
|
|
162
|
+
for (const result of results) {
|
|
163
|
+
if (result.status === "rejected")
|
|
164
|
+
throw result.reason;
|
|
165
|
+
variants.push(result.value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
161
168
|
return {
|
|
162
169
|
id: args.uploadGroupId,
|
|
163
170
|
variants,
|
|
@@ -181,41 +188,51 @@ export class R2MediaStorage {
|
|
|
181
188
|
const existing = await this.bucket.get(spec.storageKey);
|
|
182
189
|
if (!existing)
|
|
183
190
|
throw mediaDiagnostic("MEDIA_OBJECT_NOT_FOUND", { value: args.uploadGroupId });
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
191
|
+
try {
|
|
192
|
+
const actualMime = existing.httpMetadata?.contentType ?? "application/octet-stream";
|
|
193
|
+
if (actualMime !== spec.mimeType) {
|
|
194
|
+
throw mediaDiagnostic("MEDIA_MIME_REJECTED", {
|
|
195
|
+
value: actualMime,
|
|
196
|
+
expected: spec.mimeType,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (existing.size > spec.maxBytes) {
|
|
200
|
+
throw mediaDiagnostic("MEDIA_VARIANT_SIZE_EXCEEDED", {
|
|
201
|
+
value: { mimeType: spec.mimeType, byteSize: existing.size },
|
|
202
|
+
expected: `${spec.mimeType} byteSize <= ${spec.maxBytes}`,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
const customMetadata = {
|
|
206
|
+
...existing.customMetadata,
|
|
207
|
+
committedAt: String(args.now),
|
|
208
|
+
role: spec.role,
|
|
209
|
+
uploadGroupId: args.uploadGroupId,
|
|
210
|
+
filename: args.filename,
|
|
211
|
+
};
|
|
212
|
+
if (args.alt)
|
|
213
|
+
customMetadata["alt"] = args.alt;
|
|
214
|
+
if (args.caption)
|
|
215
|
+
customMetadata["caption"] = args.caption;
|
|
216
|
+
const committed = await this.bucket.put(spec.storageKey, existing.body, {
|
|
217
|
+
httpMetadata: { contentType: actualMime },
|
|
218
|
+
customMetadata,
|
|
189
219
|
});
|
|
220
|
+
if (!committed)
|
|
221
|
+
throw new Error("R2 metadata commit did not store the object.");
|
|
222
|
+
return {
|
|
223
|
+
mimeType: actualMime,
|
|
224
|
+
publicUrl: `${this.publicBase}/${spec.storageKey}`,
|
|
225
|
+
storageKey: spec.storageKey,
|
|
226
|
+
byteSize: existing.size,
|
|
227
|
+
role: spec.role,
|
|
228
|
+
};
|
|
190
229
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
230
|
+
catch (error) {
|
|
231
|
+
// Validation may reject before PUT takes ownership of the GET stream.
|
|
232
|
+
// A failed PUT may already have consumed/errored it; preserve the cause.
|
|
233
|
+
await existing.body.cancel().catch(() => { });
|
|
234
|
+
throw error;
|
|
196
235
|
}
|
|
197
|
-
const customMetadata = {
|
|
198
|
-
...existing.customMetadata,
|
|
199
|
-
committedAt: String(args.now),
|
|
200
|
-
role: spec.role,
|
|
201
|
-
uploadGroupId: args.uploadGroupId,
|
|
202
|
-
filename: args.filename,
|
|
203
|
-
};
|
|
204
|
-
if (args.alt)
|
|
205
|
-
customMetadata["alt"] = args.alt;
|
|
206
|
-
if (args.caption)
|
|
207
|
-
customMetadata["caption"] = args.caption;
|
|
208
|
-
await this.bucket.put(spec.storageKey, existing.body, {
|
|
209
|
-
httpMetadata: { contentType: actualMime },
|
|
210
|
-
customMetadata,
|
|
211
|
-
});
|
|
212
|
-
return {
|
|
213
|
-
mimeType: actualMime,
|
|
214
|
-
publicUrl: `${this.publicBase}/${spec.storageKey}`,
|
|
215
|
-
storageKey: spec.storageKey,
|
|
216
|
-
byteSize: existing.size,
|
|
217
|
-
role: spec.role,
|
|
218
|
-
};
|
|
219
236
|
}
|
|
220
237
|
/** Object keys are server-generated. Layout:
|
|
221
238
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"R2MediaStorage.js","sourceRoot":"","sources":["../../src/bindings/R2MediaStorage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAajB,MAAM,wBAAwB,CAAC;AAEhC
|
|
1
|
+
{"version":3,"file":"R2MediaStorage.js","sourceRoot":"","sources":["../../src/bindings/R2MediaStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import type { MantleCloudflareConfig } from "../mount/cmsConfig.js";
|
|
|
2
2
|
export interface ConventionalBindingsEnv {
|
|
3
3
|
readonly DB?: D1Database;
|
|
4
4
|
readonly ASSETS?: Fetcher;
|
|
5
|
+
/** Optional app/environment-owned KV namespace for MCP catalog settings. */
|
|
6
|
+
readonly MANTLE_KV?: KVNamespace;
|
|
5
7
|
}
|
|
6
8
|
export type MantleWorkerBindings = MantleCloudflareConfig["bindings"];
|
|
7
9
|
/** Bind the conventional Cloudflare names to Mantle's existing runtime adapters. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventionalBindings.d.ts","sourceRoot":"","sources":["../../src/bindings/conventionalBindings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQpE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"conventionalBindings.d.ts","sourceRoot":"","sources":["../../src/bindings/conventionalBindings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQpE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;CAClC;AAED,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;AAEtE,oFAAoF;AACpF,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,uBAAuB,GAC3B,oBAAoB,CAStB"}
|
|
@@ -10,6 +10,9 @@ export function createConventionalBindings(env) {
|
|
|
10
10
|
return {
|
|
11
11
|
db: new D1DatabaseDriver(env.DB),
|
|
12
12
|
adminAssets: env.ASSETS ? new AssetsAssetServer(env.ASSETS) : NO_ASSETS,
|
|
13
|
+
...(env.MANTLE_KV
|
|
14
|
+
? { mcpCatalogKv: { namespace: env.MANTLE_KV, scope: "default" } }
|
|
15
|
+
: {}),
|
|
13
16
|
};
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=conventionalBindings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventionalBindings.js","sourceRoot":"","sources":["../../src/bindings/conventionalBindings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,yEAAyE;AACzE,kEAAkE;AAClE,MAAM,SAAS,GAAqB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"conventionalBindings.js","sourceRoot":"","sources":["../../src/bindings/conventionalBindings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,yEAAyE;AACzE,kEAAkE;AAClE,MAAM,SAAS,GAAqB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAWhE,oFAAoF;AACpF,MAAM,UAAU,0BAA0B,CACxC,GAA4B;IAE5B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC7E,OAAO;QACL,EAAE,EAAE,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACvE,GAAG,CAAC,GAAG,CAAC,SAAS;YACf,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
|
package/dist/bindings/index.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ export { D1DatabaseDriver, type D1QueryMetric, type D1QueryObserver, } from "./D
|
|
|
2
2
|
export { AssetsAssetServer } from "./AssetsAssetServer.js";
|
|
3
3
|
export { createConventionalBindings, type ConventionalBindingsEnv, type MantleWorkerBindings, } from "./conventionalBindings.js";
|
|
4
4
|
export { R2MediaStorage } from "./R2MediaStorage.js";
|
|
5
|
+
export { KvSiteConfigRepository, type McpCatalogKvBinding, type McpCatalogSiteConfig, type McpCatalogSiteConfigReader, } from "./KvSiteConfigRepository.js";
|
|
5
6
|
export { WorkersQueueHookDispatcher, createQueueHandler, } from "./WorkersQueueHookDispatcher.js";
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|
package/dist/bindings/index.js
CHANGED
|
@@ -2,5 +2,6 @@ export { D1DatabaseDriver, } from "./D1DatabaseDriver.js";
|
|
|
2
2
|
export { AssetsAssetServer } from "./AssetsAssetServer.js";
|
|
3
3
|
export { createConventionalBindings, } from "./conventionalBindings.js";
|
|
4
4
|
export { R2MediaStorage } from "./R2MediaStorage.js";
|
|
5
|
+
export { KvSiteConfigRepository, } from "./KvSiteConfigRepository.js";
|
|
5
6
|
export { WorkersQueueHookDispatcher, createQueueHandler, } from "./WorkersQueueHookDispatcher.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,0BAA0B,GAG3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,0BAA0B,GAG3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,sBAAsB,GAIvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|