miniflare 0.0.0-020b04921

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +858 -0
  2. package/bootstrap.js +11 -0
  3. package/dist/src/index.d.ts +4408 -0
  4. package/dist/src/index.js +10391 -0
  5. package/dist/src/index.js.map +6 -0
  6. package/dist/src/workers/assets/assets-kv.worker.js +28 -0
  7. package/dist/src/workers/assets/assets-kv.worker.js.map +6 -0
  8. package/dist/src/workers/assets/assets.worker.js +9275 -0
  9. package/dist/src/workers/assets/assets.worker.js.map +6 -0
  10. package/dist/src/workers/assets/router.worker.js +8755 -0
  11. package/dist/src/workers/assets/router.worker.js.map +6 -0
  12. package/dist/src/workers/cache/cache-entry-noop.worker.js +19 -0
  13. package/dist/src/workers/cache/cache-entry-noop.worker.js.map +6 -0
  14. package/dist/src/workers/cache/cache-entry.worker.js +28 -0
  15. package/dist/src/workers/cache/cache-entry.worker.js.map +6 -0
  16. package/dist/src/workers/cache/cache.worker.js +656 -0
  17. package/dist/src/workers/cache/cache.worker.js.map +6 -0
  18. package/dist/src/workers/core/entry.worker.js +1040 -0
  19. package/dist/src/workers/core/entry.worker.js.map +6 -0
  20. package/dist/src/workers/d1/database.worker.js +350 -0
  21. package/dist/src/workers/d1/database.worker.js.map +6 -0
  22. package/dist/src/workers/kv/namespace.worker.js +258 -0
  23. package/dist/src/workers/kv/namespace.worker.js.map +6 -0
  24. package/dist/src/workers/kv/sites.worker.js +147 -0
  25. package/dist/src/workers/kv/sites.worker.js.map +6 -0
  26. package/dist/src/workers/queues/broker.worker.js +294 -0
  27. package/dist/src/workers/queues/broker.worker.js.map +6 -0
  28. package/dist/src/workers/r2/bucket.worker.js +1157 -0
  29. package/dist/src/workers/r2/bucket.worker.js.map +6 -0
  30. package/dist/src/workers/ratelimit/ratelimit.worker.js +54 -0
  31. package/dist/src/workers/ratelimit/ratelimit.worker.js.map +6 -0
  32. package/dist/src/workers/shared/index.worker.js +706 -0
  33. package/dist/src/workers/shared/index.worker.js.map +6 -0
  34. package/dist/src/workers/shared/object-entry.worker.js +21 -0
  35. package/dist/src/workers/shared/object-entry.worker.js.map +6 -0
  36. package/dist/src/workers/shared/zod.worker.js +2719 -0
  37. package/dist/src/workers/shared/zod.worker.js.map +6 -0
  38. package/package.json +108 -0
@@ -0,0 +1,258 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
5
+ (decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
6
+ return kind && result && __defProp(target, key, result), result;
7
+ };
8
+
9
+ // src/workers/kv/namespace.worker.ts
10
+ import assert from "node:assert";
11
+ import {
12
+ DeferredPromise,
13
+ DELETE,
14
+ GET,
15
+ HttpError as HttpError2,
16
+ KeyValueStorage,
17
+ maybeApply,
18
+ MiniflareDurableObject,
19
+ PUT
20
+ } from "miniflare:shared";
21
+
22
+ // src/workers/kv/constants.ts
23
+ import { testRegExps } from "miniflare:shared";
24
+ var KVLimits = {
25
+ MIN_CACHE_TTL: 60,
26
+ MAX_LIST_KEYS: 1e3,
27
+ MAX_KEY_SIZE: 512,
28
+ MAX_VALUE_SIZE: 25 * 1024 * 1024,
29
+ MAX_VALUE_SIZE_TEST: 1024,
30
+ MAX_METADATA_SIZE: 1024
31
+ }, KVParams = {
32
+ URL_ENCODED: "urlencoded",
33
+ CACHE_TTL: "cache_ttl",
34
+ EXPIRATION: "expiration",
35
+ EXPIRATION_TTL: "expiration_ttl",
36
+ LIST_LIMIT: "key_count_limit",
37
+ LIST_PREFIX: "prefix",
38
+ LIST_CURSOR: "cursor"
39
+ }, KVHeaders = {
40
+ EXPIRATION: "CF-Expiration",
41
+ METADATA: "CF-KV-Metadata"
42
+ };
43
+
44
+ // src/workers/kv/validator.worker.ts
45
+ import { Buffer as Buffer2 } from "node:buffer";
46
+ import { HttpError } from "miniflare:shared";
47
+ function decodeKey({ key }, query) {
48
+ if (query.get(KVParams.URL_ENCODED)?.toLowerCase() !== "true")
49
+ return key;
50
+ try {
51
+ return decodeURIComponent(key);
52
+ } catch (e) {
53
+ throw e instanceof URIError ? new HttpError(400, "Could not URL-decode key name") : e;
54
+ }
55
+ }
56
+ function validateKey(key) {
57
+ if (key === "")
58
+ throw new HttpError(400, "Key names must not be empty");
59
+ if (key === "." || key === "..")
60
+ throw new HttpError(
61
+ 400,
62
+ `Illegal key name "${key}". Please use a different name.`
63
+ );
64
+ validateKeyLength(key);
65
+ }
66
+ function validateKeyLength(key) {
67
+ let keyLength = Buffer2.byteLength(key);
68
+ if (keyLength > KVLimits.MAX_KEY_SIZE)
69
+ throw new HttpError(
70
+ 414,
71
+ `UTF-8 encoded length of ${keyLength} exceeds key length limit of ${KVLimits.MAX_KEY_SIZE}.`
72
+ );
73
+ }
74
+ function validateGetOptions(key, options) {
75
+ validateKey(key);
76
+ let cacheTtl = options?.cacheTtl;
77
+ if (cacheTtl !== void 0 && (isNaN(cacheTtl) || cacheTtl < KVLimits.MIN_CACHE_TTL))
78
+ throw new HttpError(
79
+ 400,
80
+ `Invalid ${KVParams.CACHE_TTL} of ${cacheTtl}. Cache TTL must be at least ${KVLimits.MIN_CACHE_TTL}.`
81
+ );
82
+ }
83
+ function validatePutOptions(key, options) {
84
+ let { now, rawExpiration, rawExpirationTtl, rawMetadata } = options;
85
+ validateKey(key);
86
+ let expiration;
87
+ if (rawExpirationTtl !== null) {
88
+ let expirationTtl = parseInt(rawExpirationTtl);
89
+ if (Number.isNaN(expirationTtl) || expirationTtl <= 0)
90
+ throw new HttpError(
91
+ 400,
92
+ `Invalid ${KVParams.EXPIRATION_TTL} of ${rawExpirationTtl}. Please specify integer greater than 0.`
93
+ );
94
+ if (expirationTtl < KVLimits.MIN_CACHE_TTL)
95
+ throw new HttpError(
96
+ 400,
97
+ `Invalid ${KVParams.EXPIRATION_TTL} of ${rawExpirationTtl}. Expiration TTL must be at least ${KVLimits.MIN_CACHE_TTL}.`
98
+ );
99
+ expiration = now + expirationTtl;
100
+ } else if (rawExpiration !== null) {
101
+ if (expiration = parseInt(rawExpiration), Number.isNaN(expiration) || expiration <= now)
102
+ throw new HttpError(
103
+ 400,
104
+ `Invalid ${KVParams.EXPIRATION} of ${rawExpiration}. Please specify integer greater than the current number of seconds since the UNIX epoch.`
105
+ );
106
+ if (expiration < now + KVLimits.MIN_CACHE_TTL)
107
+ throw new HttpError(
108
+ 400,
109
+ `Invalid ${KVParams.EXPIRATION} of ${rawExpiration}. Expiration times must be at least ${KVLimits.MIN_CACHE_TTL} seconds in the future.`
110
+ );
111
+ }
112
+ let metadata;
113
+ if (rawMetadata !== null) {
114
+ let metadataLength = Buffer2.byteLength(rawMetadata);
115
+ if (metadataLength > KVLimits.MAX_METADATA_SIZE)
116
+ throw new HttpError(
117
+ 413,
118
+ `Metadata length of ${metadataLength} exceeds limit of ${KVLimits.MAX_METADATA_SIZE}.`
119
+ );
120
+ metadata = JSON.parse(rawMetadata);
121
+ }
122
+ return { expiration, metadata };
123
+ }
124
+ function decodeListOptions(url) {
125
+ let limitParam = url.searchParams.get(KVParams.LIST_LIMIT), limit = limitParam === null ? KVLimits.MAX_LIST_KEYS : parseInt(limitParam), prefix = url.searchParams.get(KVParams.LIST_PREFIX) ?? void 0, cursor = url.searchParams.get(KVParams.LIST_CURSOR) ?? void 0;
126
+ return { limit, prefix, cursor };
127
+ }
128
+ function validateListOptions(options) {
129
+ let limit = options.limit;
130
+ if (limit !== void 0) {
131
+ if (isNaN(limit) || limit < 1)
132
+ throw new HttpError(
133
+ 400,
134
+ `Invalid ${KVParams.LIST_LIMIT} of ${limit}. Please specify an integer greater than 0.`
135
+ );
136
+ if (limit > KVLimits.MAX_LIST_KEYS)
137
+ throw new HttpError(
138
+ 400,
139
+ `Invalid ${KVParams.LIST_LIMIT} of ${limit}. Please specify an integer less than ${KVLimits.MAX_LIST_KEYS}.`
140
+ );
141
+ }
142
+ let prefix = options.prefix;
143
+ prefix != null && validateKeyLength(prefix);
144
+ }
145
+
146
+ // src/workers/kv/namespace.worker.ts
147
+ function createMaxValueSizeError(length, maxValueSize) {
148
+ return new HttpError2(
149
+ 413,
150
+ `Value length of ${length} exceeds limit of ${maxValueSize}.`
151
+ );
152
+ }
153
+ var MaxLengthStream = class extends TransformStream {
154
+ signal;
155
+ length;
156
+ constructor(maxLength) {
157
+ let abortController = new AbortController(), lengthPromise = new DeferredPromise(), length = 0;
158
+ super({
159
+ transform(chunk, controller) {
160
+ length += chunk.byteLength, length <= maxLength ? controller.enqueue(chunk) : abortController.signal.aborted || abortController.abort();
161
+ },
162
+ flush() {
163
+ lengthPromise.resolve(length);
164
+ }
165
+ }), this.signal = abortController.signal, this.length = lengthPromise;
166
+ }
167
+ };
168
+ function millisToSeconds(millis) {
169
+ return Math.floor(millis / 1e3);
170
+ }
171
+ function secondsToMillis(seconds) {
172
+ return seconds * 1e3;
173
+ }
174
+ var KVNamespaceObject = class extends MiniflareDurableObject {
175
+ #storage;
176
+ get storage() {
177
+ return this.#storage ??= new KeyValueStorage(this);
178
+ }
179
+ get = async (req, params, url) => {
180
+ let key = decodeKey(params, url.searchParams), cacheTtlParam = url.searchParams.get(KVParams.CACHE_TTL), cacheTtl = cacheTtlParam === null ? void 0 : parseInt(cacheTtlParam);
181
+ validateGetOptions(key, { cacheTtl });
182
+ let entry = await this.storage.get(key);
183
+ if (entry === null)
184
+ throw new HttpError2(404, "Not Found");
185
+ let headers = new Headers();
186
+ return entry.expiration !== void 0 && headers.set(
187
+ KVHeaders.EXPIRATION,
188
+ millisToSeconds(entry.expiration).toString()
189
+ ), entry.metadata !== void 0 && headers.set(KVHeaders.METADATA, JSON.stringify(entry.metadata)), new Response(entry.value, { headers });
190
+ };
191
+ put = async (req, params, url) => {
192
+ let key = decodeKey(params, url.searchParams), rawExpiration = url.searchParams.get(KVParams.EXPIRATION), rawExpirationTtl = url.searchParams.get(KVParams.EXPIRATION_TTL), rawMetadata = req.headers.get(KVHeaders.METADATA), now = millisToSeconds(this.timers.now()), { expiration, metadata } = validatePutOptions(key, {
193
+ now,
194
+ rawExpiration,
195
+ rawExpirationTtl,
196
+ rawMetadata
197
+ }), value = req.body, contentLength = parseInt(req.headers.get("Content-Length")), valueLengthHint;
198
+ Number.isNaN(contentLength) ? value === null && (valueLengthHint = 0) : valueLengthHint = contentLength, value ??= new ReadableStream({
199
+ start(controller) {
200
+ controller.close();
201
+ }
202
+ });
203
+ let maxValueSize = this.beingTested ? KVLimits.MAX_VALUE_SIZE_TEST : KVLimits.MAX_VALUE_SIZE, maxLengthStream;
204
+ if (valueLengthHint !== void 0 && valueLengthHint > maxValueSize)
205
+ throw createMaxValueSizeError(valueLengthHint, maxValueSize);
206
+ maxLengthStream = new MaxLengthStream(maxValueSize), value = value.pipeThrough(maxLengthStream);
207
+ try {
208
+ await this.storage.put({
209
+ key,
210
+ value,
211
+ expiration: maybeApply(secondsToMillis, expiration),
212
+ metadata,
213
+ signal: maxLengthStream?.signal
214
+ });
215
+ } catch (e) {
216
+ if (typeof e == "object" && e !== null && "name" in e && e.name === "AbortError") {
217
+ assert(maxLengthStream !== void 0);
218
+ let length = await maxLengthStream.length;
219
+ throw createMaxValueSizeError(length, maxValueSize);
220
+ } else
221
+ throw e;
222
+ }
223
+ return new Response();
224
+ };
225
+ delete = async (req, params, url) => {
226
+ let key = decodeKey(params, url.searchParams);
227
+ return validateKey(key), await this.storage.delete(key), new Response();
228
+ };
229
+ list = async (req, params, url) => {
230
+ let options = decodeListOptions(url);
231
+ validateListOptions(options);
232
+ let res = await this.storage.list(options), keys = res.keys.map((key) => ({
233
+ name: key.key,
234
+ expiration: maybeApply(millisToSeconds, key.expiration),
235
+ // workerd expects metadata to be a JSON-serialised string
236
+ metadata: maybeApply(JSON.stringify, key.metadata)
237
+ })), result;
238
+ return res.cursor === void 0 ? result = { keys, list_complete: !0, cacheStatus: null } : result = {
239
+ keys,
240
+ list_complete: !1,
241
+ cursor: res.cursor,
242
+ cacheStatus: null
243
+ }, Response.json(result);
244
+ };
245
+ };
246
+ __decorateClass([
247
+ GET("/:key")
248
+ ], KVNamespaceObject.prototype, "get", 2), __decorateClass([
249
+ PUT("/:key")
250
+ ], KVNamespaceObject.prototype, "put", 2), __decorateClass([
251
+ DELETE("/:key")
252
+ ], KVNamespaceObject.prototype, "delete", 2), __decorateClass([
253
+ GET("/")
254
+ ], KVNamespaceObject.prototype, "list", 2);
255
+ export {
256
+ KVNamespaceObject
257
+ };
258
+ //# sourceMappingURL=namespace.worker.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/workers/kv/namespace.worker.ts", "../../../../src/workers/kv/constants.ts", "../../../../src/workers/kv/validator.worker.ts"],
4
+ "mappings": "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",
5
+ "names": ["HttpError", "Buffer", "Buffer", "HttpError"]
6
+ }
@@ -0,0 +1,147 @@
1
+ // src/workers/kv/sites.worker.ts
2
+ import { base64Decode, base64Encode, SharedBindings } from "miniflare:shared";
3
+
4
+ // src/workers/kv/constants.ts
5
+ import { testRegExps } from "miniflare:shared";
6
+ var KVLimits = {
7
+ MIN_CACHE_TTL: 60,
8
+ MAX_LIST_KEYS: 1e3,
9
+ MAX_KEY_SIZE: 512,
10
+ MAX_VALUE_SIZE: 25 * 1024 * 1024,
11
+ MAX_VALUE_SIZE_TEST: 1024,
12
+ MAX_METADATA_SIZE: 1024
13
+ }, KVParams = {
14
+ URL_ENCODED: "urlencoded",
15
+ CACHE_TTL: "cache_ttl",
16
+ EXPIRATION: "expiration",
17
+ EXPIRATION_TTL: "expiration_ttl",
18
+ LIST_LIMIT: "key_count_limit",
19
+ LIST_PREFIX: "prefix",
20
+ LIST_CURSOR: "cursor"
21
+ };
22
+ var SiteBindings = {
23
+ KV_NAMESPACE_SITE: "__STATIC_CONTENT",
24
+ JSON_SITE_MANIFEST: "__STATIC_CONTENT_MANIFEST",
25
+ JSON_SITE_FILTER: "MINIFLARE_SITE_FILTER"
26
+ }, SITES_NO_CACHE_PREFIX = "$__MINIFLARE_SITES__$/";
27
+ function encodeSitesKey(key) {
28
+ return SITES_NO_CACHE_PREFIX + encodeURIComponent(key);
29
+ }
30
+ function decodeSitesKey(key) {
31
+ return key.startsWith(SITES_NO_CACHE_PREFIX) ? decodeURIComponent(key.substring(SITES_NO_CACHE_PREFIX.length)) : key;
32
+ }
33
+ function deserialiseRegExps(matcher) {
34
+ return {
35
+ include: matcher.include.map((regExp) => new RegExp(regExp)),
36
+ exclude: matcher.exclude.map((regExp) => new RegExp(regExp))
37
+ };
38
+ }
39
+ function deserialiseSiteRegExps(siteRegExps) {
40
+ return {
41
+ include: siteRegExps.include && deserialiseRegExps(siteRegExps.include),
42
+ exclude: siteRegExps.exclude && deserialiseRegExps(siteRegExps.exclude)
43
+ };
44
+ }
45
+ function testSiteRegExps(regExps, key) {
46
+ return regExps.include !== void 0 ? testRegExps(regExps.include, key) : regExps.exclude !== void 0 ? !testRegExps(regExps.exclude, key) : !0;
47
+ }
48
+
49
+ // src/workers/kv/validator.worker.ts
50
+ import { Buffer } from "node:buffer";
51
+ import { HttpError } from "miniflare:shared";
52
+ function validateKeyLength(key) {
53
+ let keyLength = Buffer.byteLength(key);
54
+ if (keyLength > KVLimits.MAX_KEY_SIZE)
55
+ throw new HttpError(
56
+ 414,
57
+ `UTF-8 encoded length of ${keyLength} exceeds key length limit of ${KVLimits.MAX_KEY_SIZE}.`
58
+ );
59
+ }
60
+ function decodeListOptions(url) {
61
+ let limitParam = url.searchParams.get(KVParams.LIST_LIMIT), limit = limitParam === null ? KVLimits.MAX_LIST_KEYS : parseInt(limitParam), prefix = url.searchParams.get(KVParams.LIST_PREFIX) ?? void 0, cursor = url.searchParams.get(KVParams.LIST_CURSOR) ?? void 0;
62
+ return { limit, prefix, cursor };
63
+ }
64
+ function validateListOptions(options) {
65
+ let limit = options.limit;
66
+ if (limit !== void 0) {
67
+ if (isNaN(limit) || limit < 1)
68
+ throw new HttpError(
69
+ 400,
70
+ `Invalid ${KVParams.LIST_LIMIT} of ${limit}. Please specify an integer greater than 0.`
71
+ );
72
+ if (limit > KVLimits.MAX_LIST_KEYS)
73
+ throw new HttpError(
74
+ 400,
75
+ `Invalid ${KVParams.LIST_LIMIT} of ${limit}. Please specify an integer less than ${KVLimits.MAX_LIST_KEYS}.`
76
+ );
77
+ }
78
+ let prefix = options.prefix;
79
+ prefix != null && validateKeyLength(prefix);
80
+ }
81
+
82
+ // src/workers/kv/sites.worker.ts
83
+ var siteRegExpsCache = /* @__PURE__ */ new WeakMap();
84
+ function getSiteRegExps(env) {
85
+ let regExps = siteRegExpsCache.get(env);
86
+ return regExps !== void 0 || (regExps = deserialiseSiteRegExps(env[SiteBindings.JSON_SITE_FILTER]), siteRegExpsCache.set(env, regExps)), regExps;
87
+ }
88
+ async function* walkDirectory(blobsService, path = "") {
89
+ let res = await blobsService.fetch(`http://placeholder/${path}`);
90
+ if (!(res.headers.get("Content-Type") ?? "").toLowerCase().startsWith("application/json")) {
91
+ await res.body?.pipeTo(new WritableStream()), yield path;
92
+ return;
93
+ }
94
+ let entries = await res.json();
95
+ for (let { name, type } of entries) {
96
+ let entryPath = `${path}${path === "" ? "" : "/"}${name}`;
97
+ type === "directory" ? yield* walkDirectory(blobsService, entryPath) : yield entryPath;
98
+ }
99
+ }
100
+ var encoder = new TextEncoder();
101
+ function arrayCompare(a, b) {
102
+ let minLength = Math.min(a.length, b.length);
103
+ for (let i = 0; i < minLength; i++) {
104
+ let aElement = a[i], bElement = b[i];
105
+ if (aElement < bElement)
106
+ return -1;
107
+ if (aElement > bElement)
108
+ return 1;
109
+ }
110
+ return a.length - b.length;
111
+ }
112
+ async function handleListRequest(url, blobsService, siteRegExps) {
113
+ let options = decodeListOptions(url);
114
+ validateListOptions(options);
115
+ let { limit = KVLimits.MAX_LIST_KEYS, prefix, cursor } = options, keys = [];
116
+ for await (let name of walkDirectory(blobsService))
117
+ testSiteRegExps(siteRegExps, name) && (name = encodeSitesKey(name), !(prefix !== void 0 && !name.startsWith(prefix)) && keys.push({ name, encodedName: encoder.encode(name) }));
118
+ keys.sort((a, b) => arrayCompare(a.encodedName, b.encodedName));
119
+ for (let key of keys)
120
+ delete key.encodedName;
121
+ let startAfter = cursor === void 0 ? "" : base64Decode(cursor), startIndex = 0;
122
+ startAfter !== "" && (startIndex = keys.findIndex(({ name }) => name === startAfter), startIndex === -1 && (startIndex = keys.length), startIndex++);
123
+ let endIndex = startIndex + limit, nextCursor = endIndex < keys.length ? base64Encode(keys[endIndex - 1].name) : void 0;
124
+ return keys = keys.slice(startIndex, endIndex), nextCursor === void 0 ? Response.json({ keys, list_complete: !0 }) : Response.json({ keys, list_complete: !1, cursor: nextCursor });
125
+ }
126
+ var sites_worker_default = {
127
+ async fetch(request, env) {
128
+ if (request.method !== "GET") {
129
+ let message = `Cannot ${request.method.toLowerCase()}() with Workers Sites namespace`;
130
+ return new Response(message, { status: 405, statusText: message });
131
+ }
132
+ let url = new URL(request.url), key = url.pathname.substring(1);
133
+ url.searchParams.get(KVParams.URL_ENCODED)?.toLowerCase() === "true" && (key = decodeURIComponent(key)), key = decodeSitesKey(key);
134
+ let siteRegExps = getSiteRegExps(env);
135
+ if (key !== "" && !testSiteRegExps(siteRegExps, key))
136
+ return new Response("Not Found", {
137
+ status: 404,
138
+ statusText: "Not Found"
139
+ });
140
+ let blobsService = env[SharedBindings.MAYBE_SERVICE_BLOBS];
141
+ return key === "" ? handleListRequest(url, blobsService, siteRegExps) : blobsService.fetch(new URL(key, "http://placeholder"));
142
+ }
143
+ };
144
+ export {
145
+ sites_worker_default as default
146
+ };
147
+ //# sourceMappingURL=sites.worker.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/workers/kv/sites.worker.ts", "../../../../src/workers/kv/constants.ts", "../../../../src/workers/kv/validator.worker.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }