@panorama-industries/effect-vercel-blob 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -1
  3. package/dist/client.d.ts +8 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +8 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/contracts/blob-client.d.ts +67 -0
  8. package/dist/contracts/blob-client.d.ts.map +1 -0
  9. package/dist/contracts/blob-client.js +11 -0
  10. package/dist/contracts/blob-client.js.map +1 -0
  11. package/dist/contracts/blob-config.d.ts +114 -0
  12. package/dist/contracts/blob-config.d.ts.map +1 -0
  13. package/dist/contracts/blob-config.js +7 -0
  14. package/dist/contracts/blob-config.js.map +1 -0
  15. package/dist/contracts/blob-domain.d.ts +336 -0
  16. package/dist/contracts/blob-domain.d.ts.map +1 -0
  17. package/dist/contracts/blob-domain.js +152 -0
  18. package/dist/contracts/blob-domain.js.map +1 -0
  19. package/dist/contracts/blob-errors.d.ts +125 -0
  20. package/dist/contracts/blob-errors.d.ts.map +1 -0
  21. package/dist/contracts/blob-errors.js +114 -0
  22. package/dist/contracts/blob-errors.js.map +1 -0
  23. package/dist/contracts/blob-signed-urls.d.ts +83 -0
  24. package/dist/contracts/blob-signed-urls.d.ts.map +1 -0
  25. package/dist/contracts/blob-signed-urls.js +10 -0
  26. package/dist/contracts/blob-signed-urls.js.map +1 -0
  27. package/dist/contracts/blob-store.d.ts +153 -0
  28. package/dist/contracts/blob-store.d.ts.map +1 -0
  29. package/dist/contracts/blob-store.js +15 -0
  30. package/dist/contracts/blob-store.js.map +1 -0
  31. package/dist/contracts/blob-uploads.d.ts +101 -0
  32. package/dist/contracts/blob-uploads.d.ts.map +1 -0
  33. package/dist/contracts/blob-uploads.js +17 -0
  34. package/dist/contracts/blob-uploads.js.map +1 -0
  35. package/dist/implementation/blob-client-live.d.ts +37 -0
  36. package/dist/implementation/blob-client-live.d.ts.map +1 -0
  37. package/dist/implementation/blob-client-live.js +213 -0
  38. package/dist/implementation/blob-client-live.js.map +1 -0
  39. package/dist/implementation/blob-config-live.d.ts +49 -0
  40. package/dist/implementation/blob-config-live.d.ts.map +1 -0
  41. package/dist/implementation/blob-config-live.js +82 -0
  42. package/dist/implementation/blob-config-live.js.map +1 -0
  43. package/dist/implementation/blob-live.d.ts +16 -0
  44. package/dist/implementation/blob-live.d.ts.map +1 -0
  45. package/dist/implementation/blob-live.js +16 -0
  46. package/dist/implementation/blob-live.js.map +1 -0
  47. package/dist/implementation/blob-signed-urls-live.d.ts +12 -0
  48. package/dist/implementation/blob-signed-urls-live.d.ts.map +1 -0
  49. package/dist/implementation/blob-signed-urls-live.js +92 -0
  50. package/dist/implementation/blob-signed-urls-live.js.map +1 -0
  51. package/dist/implementation/blob-store-live.d.ts +18 -0
  52. package/dist/implementation/blob-store-live.d.ts.map +1 -0
  53. package/dist/implementation/blob-store-live.js +364 -0
  54. package/dist/implementation/blob-store-live.js.map +1 -0
  55. package/dist/implementation/blob-uploads-live.d.ts +11 -0
  56. package/dist/implementation/blob-uploads-live.d.ts.map +1 -0
  57. package/dist/implementation/blob-uploads-live.js +218 -0
  58. package/dist/implementation/blob-uploads-live.js.map +1 -0
  59. package/dist/index.d.ts +15 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +15 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/internal/blob-errors.d.ts +79 -0
  64. package/dist/internal/blob-errors.d.ts.map +1 -0
  65. package/dist/internal/blob-errors.js +196 -0
  66. package/dist/internal/blob-errors.js.map +1 -0
  67. package/dist/internal/blob-request.d.ts +255 -0
  68. package/dist/internal/blob-request.d.ts.map +1 -0
  69. package/dist/internal/blob-request.js +291 -0
  70. package/dist/internal/blob-request.js.map +1 -0
  71. package/dist/internal/callback.d.ts +70 -0
  72. package/dist/internal/callback.d.ts.map +1 -0
  73. package/dist/internal/callback.js +141 -0
  74. package/dist/internal/callback.js.map +1 -0
  75. package/dist/internal/client-token.d.ts +65 -0
  76. package/dist/internal/client-token.d.ts.map +1 -0
  77. package/dist/internal/client-token.js +80 -0
  78. package/dist/internal/client-token.js.map +1 -0
  79. package/dist/internal/env.d.ts +34 -0
  80. package/dist/internal/env.d.ts.map +1 -0
  81. package/dist/internal/env.js +61 -0
  82. package/dist/internal/env.js.map +1 -0
  83. package/dist/internal/multipart.d.ts +110 -0
  84. package/dist/internal/multipart.d.ts.map +1 -0
  85. package/dist/internal/multipart.js +290 -0
  86. package/dist/internal/multipart.js.map +1 -0
  87. package/dist/internal/presign.d.ts +123 -0
  88. package/dist/internal/presign.d.ts.map +1 -0
  89. package/dist/internal/presign.js +345 -0
  90. package/dist/internal/presign.js.map +1 -0
  91. package/dist/internal/store-id.d.ts +38 -0
  92. package/dist/internal/store-id.d.ts.map +1 -0
  93. package/dist/internal/store-id.js +54 -0
  94. package/dist/internal/store-id.js.map +1 -0
  95. package/dist/internal/urls.d.ts +26 -0
  96. package/dist/internal/urls.d.ts.map +1 -0
  97. package/dist/internal/urls.js +33 -0
  98. package/dist/internal/urls.js.map +1 -0
  99. package/dist/internal/wire.d.ts +55 -0
  100. package/dist/internal/wire.d.ts.map +1 -0
  101. package/dist/internal/wire.js +64 -0
  102. package/dist/internal/wire.js.map +1 -0
  103. package/dist/internal/write-headers.d.ts +56 -0
  104. package/dist/internal/write-headers.d.ts.map +1 -0
  105. package/dist/internal/write-headers.js +82 -0
  106. package/dist/internal/write-headers.js.map +1 -0
  107. package/dist/testing/index.d.ts +2 -0
  108. package/dist/testing/index.d.ts.map +1 -0
  109. package/dist/testing/index.js +2 -0
  110. package/dist/testing/index.js.map +1 -0
  111. package/dist/testing/test-blob-store.d.ts +134 -0
  112. package/dist/testing/test-blob-store.d.ts.map +1 -0
  113. package/dist/testing/test-blob-store.js +718 -0
  114. package/dist/testing/test-blob-store.js.map +1 -0
  115. package/package.json +58 -4
  116. package/src/client.ts +11 -0
  117. package/src/contracts/blob-client.ts +121 -0
  118. package/src/contracts/blob-config.ts +64 -0
  119. package/src/contracts/blob-domain.ts +304 -0
  120. package/src/contracts/blob-errors.ts +161 -0
  121. package/src/contracts/blob-signed-urls.ts +112 -0
  122. package/src/contracts/blob-store.ts +258 -0
  123. package/src/contracts/blob-uploads.ts +151 -0
  124. package/src/implementation/blob-client-live.ts +387 -0
  125. package/src/implementation/blob-config-live.ts +145 -0
  126. package/src/implementation/blob-live.ts +30 -0
  127. package/src/implementation/blob-signed-urls-live.ts +121 -0
  128. package/src/implementation/blob-store-live.ts +528 -0
  129. package/src/implementation/blob-uploads-live.ts +326 -0
  130. package/src/index.ts +18 -0
  131. package/src/internal/blob-errors.ts +325 -0
  132. package/src/internal/blob-request.ts +617 -0
  133. package/src/internal/callback.ts +200 -0
  134. package/src/internal/client-token.ts +132 -0
  135. package/src/internal/env.ts +128 -0
  136. package/src/internal/multipart.ts +526 -0
  137. package/src/internal/presign.ts +477 -0
  138. package/src/internal/store-id.ts +69 -0
  139. package/src/internal/urls.ts +42 -0
  140. package/src/internal/wire.ts +80 -0
  141. package/src/internal/write-headers.ts +118 -0
  142. package/src/testing/index.ts +1 -0
  143. package/src/testing/test-blob-store.ts +1136 -0
@@ -0,0 +1,364 @@
1
+ import { ApiNetworkFailure, VercelApiError, VercelOidc, vercelApiErrorFromStatus, } from "@panorama-industries/effect-vercel-core";
2
+ import { Clock, DateTime, Effect, Layer, Option, Stream } from "effect";
3
+ import { Headers, HttpClient } from "effect/http";
4
+ import { BlobConfig } from "../contracts/blob-config.js";
5
+ import { FetchedBlob, GetBlobResult, PutBlobResult } from "../contracts/blob-domain.js";
6
+ import { BlobNotFound, BlobUploadRejected, ContentTypeNotAllowed, } from "../contracts/blob-errors.js";
7
+ import { BlobStore } from "../contracts/blob-store.js";
8
+ import { BlobRequestAuth, blobRequester, blobRequestSettings, serverBlobAuth, } from "../internal/blob-request.js";
9
+ import * as Multipart from "../internal/multipart.js";
10
+ import { blobUrl, downloadUrl, isAllowedBlobUrl, isUrl } from "../internal/urls.js";
11
+ import { CreateFolderResponse, HeadBlobResponse, ListResponse, PutBlobResponse, } from "../internal/wire.js";
12
+ import { allowedWriteOptions, copyWriteHeaders, writeHeaders } from "../internal/write-headers.js";
13
+ /*
14
+ * Domain errors each operation reports, matching the error unions of its contract. Every other
15
+ * domain code an error body carries is reported as `VercelApiError` for its status.
16
+ */
17
+ const requestErrors = ["BlobStoreUnavailable", "BlobOidcEnvironmentNotAllowed"];
18
+ const readErrors = [...requestErrors, "BlobNotFound"];
19
+ const deleteErrors = [...requestErrors, "BlobPreconditionFailed"];
20
+ const writeErrors = [...requestErrors, "BlobPreconditionFailed", "BlobUploadRejected"];
21
+ const copyErrors = [...writeErrors, "BlobNotFound"];
22
+ /** `put` progress events are throttled like the SDK's `throttle(onUploadProgress, 100)`. */
23
+ const putProgressInterval = "100 millis";
24
+ /** The SDK's `optimizeImageFormatToMimeType`: `format` is sent as the output mime type. */
25
+ const imageFormatMimeType = {
26
+ jpeg: "image/jpeg",
27
+ png: "image/png",
28
+ webp: "image/webp",
29
+ avif: "image/avif",
30
+ };
31
+ const defaultImageQuality = 75;
32
+ /** The SDK's `addOptimizeImageParams`; the branded option types already hold its validation. */
33
+ const addImageParams = (params, optimization) => {
34
+ params.set("width", String(optimization.width));
35
+ params.set("quality", String(optimization.quality ?? defaultImageQuality));
36
+ if (optimization.format !== undefined) {
37
+ params.set("format", imageFormatMimeType[optimization.format]);
38
+ }
39
+ };
40
+ const isBlob = (body) => typeof globalThis.Blob !== "undefined" && body instanceof globalThis.Blob;
41
+ /**
42
+ * The SDK's `validateOptimizeImageSourceContentType`: a known media type that is neither an image
43
+ * nor `application/octet-stream` cannot be optimized. Unknown types are left to the server.
44
+ */
45
+ const nonImageMediaType = (mediaType) => mediaType !== "" && mediaType !== "application/octet-stream" && !mediaType.startsWith("image/");
46
+ const locatorString = (locator) => typeof locator === "string" ? locator : locator.href;
47
+ /** A defect carrying the SDK's `BlobError` message, for input the SDK rejects by throwing. */
48
+ const invalidInput = (message) => Effect.die(new Error(`Vercel Blob: ${message}`));
49
+ const notBlobStoreUrl = "Invalid URL: the URL does not point to a Vercel Blob store. Use a pathname instead, see https://vercel.com/docs/vercel-blob";
50
+ const header = (headers, name) => Option.getOrUndefined(Headers.get(headers, name));
51
+ const multipartOperations = (dependencies) => {
52
+ const target = {
53
+ requester: dependencies.requester,
54
+ auth: dependencies.auth,
55
+ service: "BlobStore",
56
+ domainErrors: writeErrors,
57
+ writeOptions: Multipart.serverMultipartWriteOptions,
58
+ };
59
+ return {
60
+ put: (pathname, body, options) => Multipart.multipartPut(target, pathname, body, options),
61
+ createMultipartUpload: Effect.fn("BlobStore.createMultipartUpload")(function* (pathname, options) {
62
+ return yield* Multipart.createMultipartUpload(target, pathname, options);
63
+ }),
64
+ uploadPart: Effect.fn("BlobStore.uploadPart")(function* (upload, partNumber, body) {
65
+ return yield* Multipart.uploadPart(target, upload, partNumber, body);
66
+ }),
67
+ completeMultipartUpload: Effect.fn("BlobStore.completeMultipartUpload")(function* (upload, parts) {
68
+ return yield* Multipart.completeMultipartUpload(target, upload, parts);
69
+ }),
70
+ };
71
+ };
72
+ /**
73
+ * Implements {@link BlobStore} over the Blob API with the SDK's wire protocol, retries and error
74
+ * mapping. Requires `BlobConfig`, an `HttpClient`, and `VercelOidc` (evaluated per request when
75
+ * `BlobConfig.auth` is OIDC).
76
+ *
77
+ * `get` reads from the blob's host. A URL locator must pass the SDK's `isAllowedBlobUrl` check (a
78
+ * `*.blob.vercel-storage.com` host, or the origin of an overridden API URL); any other URL, or a
79
+ * string that starts with `http(s)://` but does not parse, is a defect, as are an empty `get`
80
+ * locator and a `putImage` source `URL` that is not http(s). These are programming errors the SDK
81
+ * throws `BlobError` for.
82
+ */
83
+ export const BlobStoreLive = Layer.effect(BlobStore, Effect.gen(function* () {
84
+ const config = yield* BlobConfig;
85
+ const httpClient = yield* HttpClient.HttpClient;
86
+ const oidc = yield* VercelOidc;
87
+ const requester = blobRequester(blobRequestSettings(config, httpClient));
88
+ const auth = serverBlobAuth(config, oidc);
89
+ const multipart = multipartOperations({ requester, auth });
90
+ const put = Effect.fn("BlobStore.put")(function* (pathname, body, options) {
91
+ if (options.multipart === true) {
92
+ return yield* multipart.put(pathname, body, options);
93
+ }
94
+ const query = new URLSearchParams({ pathname });
95
+ return yield* requester.call({
96
+ operation: "BlobStore.put",
97
+ method: "PUT",
98
+ path: `/?${query.toString()}`,
99
+ auth,
100
+ response: PutBlobResponse,
101
+ headers: writeHeaders(allowedWriteOptions.put, options),
102
+ body,
103
+ locator: pathname,
104
+ domainErrors: writeErrors,
105
+ onUploadProgress: options.onUploadProgress,
106
+ progressInterval: putProgressInterval,
107
+ });
108
+ });
109
+ const putImage = Effect.fn("BlobStore.putImage")(function* (pathname, source, options) {
110
+ const headers = writeHeaders(allowedWriteOptions.putImage, options);
111
+ if (source instanceof URL) {
112
+ if (source.protocol !== "http:" && source.protocol !== "https:") {
113
+ return yield* invalidInput("the source URL must use the http(s) protocol");
114
+ }
115
+ const query = new URLSearchParams({ pathname, url: source.toString() });
116
+ addImageParams(query, options.optimizeImage);
117
+ return yield* requester.call({
118
+ operation: "BlobStore.putImage",
119
+ method: "POST",
120
+ path: `/put-from-url?${query.toString()}`,
121
+ auth,
122
+ response: PutBlobResponse,
123
+ headers,
124
+ locator: pathname,
125
+ domainErrors: writeErrors,
126
+ onUploadProgress: options.onUploadProgress,
127
+ });
128
+ }
129
+ if (isBlob(source) && nonImageMediaType(source.type)) {
130
+ return yield* new BlobUploadRejected({
131
+ reason: new ContentTypeNotAllowed({
132
+ message: `optimizeImage requires an image body, but the content type is "${source.type}"`,
133
+ }),
134
+ });
135
+ }
136
+ const query = new URLSearchParams({ pathname });
137
+ addImageParams(query, options.optimizeImage);
138
+ return yield* requester.call({
139
+ operation: "BlobStore.putImage",
140
+ method: "POST",
141
+ path: `/put-optimized?${query.toString()}`,
142
+ auth,
143
+ response: PutBlobResponse,
144
+ headers,
145
+ body: source,
146
+ locator: pathname,
147
+ domainErrors: writeErrors,
148
+ onUploadProgress: options.onUploadProgress,
149
+ });
150
+ });
151
+ const head = Effect.fn("BlobStore.head")(function* (blob) {
152
+ const locator = locatorString(blob);
153
+ const query = new URLSearchParams({ url: locator });
154
+ return yield* requester.call({
155
+ operation: "BlobStore.head",
156
+ method: "GET",
157
+ path: `?${query.toString()}`,
158
+ auth,
159
+ response: HeadBlobResponse,
160
+ locator,
161
+ domainErrors: readErrors,
162
+ });
163
+ });
164
+ /** Where `get` reads a locator, and the pathname it reports, as the SDK resolves them. */
165
+ const resolveBlobUrl = (blob, storeId, access) => {
166
+ if (typeof blob === "string" && !isUrl(blob)) {
167
+ return Effect.succeed({
168
+ url: blobUrl(config.blobBaseUrl(storeId, access), blob),
169
+ pathname: blob,
170
+ });
171
+ }
172
+ return Effect.suspend(() => {
173
+ let url;
174
+ try {
175
+ url = typeof blob === "string" ? new URL(blob) : new URL(blob.href);
176
+ }
177
+ catch {
178
+ return invalidInput("Invalid URL: unable to parse the provided URL");
179
+ }
180
+ if (!isAllowedBlobUrl(url, config.apiUrl)) {
181
+ return invalidInput(notBlobStoreUrl);
182
+ }
183
+ return Effect.succeed({ url, pathname: url.pathname.slice(1) });
184
+ });
185
+ };
186
+ const get = Effect.fn("BlobStore.get")(function* (blob, options) {
187
+ const operation = "BlobStore.get";
188
+ const locator = locatorString(blob);
189
+ if (locator === "") {
190
+ return yield* invalidInput("url or pathname is required");
191
+ }
192
+ const requestAuth = yield* auth;
193
+ if (!BlobRequestAuth.$is("Bearer")(requestAuth)) {
194
+ return yield* invalidInput("Presigned URLs are not supported for the get method");
195
+ }
196
+ // Server auth only carries store ids from `BlobConfig` or a read-write token: both StoreIds.
197
+ const storeId = requestAuth.storeId;
198
+ const { url, pathname } = yield* resolveBlobUrl(blob, storeId, options.access);
199
+ // `useCache: false` bypasses the CDN; the store supports it for private blobs only.
200
+ const fetchUrl = new URL(url.href);
201
+ if (options.useCache === false && options.access === "private") {
202
+ fetchUrl.searchParams.set("cache", "0");
203
+ }
204
+ const response = yield* requester.fetch({
205
+ operation,
206
+ url: fetchUrl,
207
+ token: requestAuth.token,
208
+ headers: {
209
+ ...(options.ifNoneMatch ? { "if-none-match": options.ifNoneMatch } : {}),
210
+ ...options.headers,
211
+ },
212
+ });
213
+ const headers = response.headers;
214
+ if (response.status === 404) {
215
+ yield* Effect.ignore(response.arrayBuffer);
216
+ return yield* new BlobNotFound({ locator });
217
+ }
218
+ if (response.status !== 304 && (response.status < 200 || response.status >= 300)) {
219
+ yield* Effect.ignore(response.arrayBuffer);
220
+ const now = yield* Clock.currentTimeMillis;
221
+ return yield* vercelApiErrorFromStatus({
222
+ operation,
223
+ status: response.status,
224
+ message: `Failed to fetch blob: ${response.status}`,
225
+ errorCode: Option.none(),
226
+ headers,
227
+ }, now);
228
+ }
229
+ const lastModified = Option.flatMap(Option.fromUndefinedOr(header(headers, "last-modified")), (value) => DateTime.make(value));
230
+ const uploadedAt = Option.isSome(lastModified) ? lastModified.value : yield* DateTime.now;
231
+ const fetched = new FetchedBlob({
232
+ url,
233
+ downloadUrl: downloadUrl(url),
234
+ pathname,
235
+ contentDisposition: header(headers, "content-disposition") || "",
236
+ cacheControl: header(headers, "cache-control") || "",
237
+ uploadedAt,
238
+ etag: header(headers, "etag") || "",
239
+ });
240
+ if (response.status === 304) {
241
+ return GetBlobResult.NotModified({ blob: fetched, headers });
242
+ }
243
+ const contentLength = header(headers, "content-length");
244
+ return GetBlobResult.Found({
245
+ blob: fetched,
246
+ contentType: header(headers, "content-type") || "application/octet-stream",
247
+ size: contentLength ? Number.parseInt(contentLength, 10) : 0,
248
+ headers,
249
+ body: response.stream.pipe(Stream.mapError((error) => new VercelApiError({
250
+ operation,
251
+ errorCode: Option.none(),
252
+ reason: new ApiNetworkFailure({ message: error.message, cause: error }),
253
+ }))),
254
+ });
255
+ });
256
+ const list = Effect.fn("BlobStore.list")(function* (options = {}) {
257
+ const query = new URLSearchParams();
258
+ if (options.limit)
259
+ query.set("limit", options.limit.toString());
260
+ if (options.prefix)
261
+ query.set("prefix", options.prefix);
262
+ if (options.cursor)
263
+ query.set("cursor", options.cursor);
264
+ if (options.mode)
265
+ query.set("mode", options.mode);
266
+ return yield* requester.call({
267
+ operation: "BlobStore.list",
268
+ method: "GET",
269
+ // An empty query is omitted: the SDK's undici drops a bare `?`, other fetches send it.
270
+ path: query.size === 0 ? "" : `?${query.toString()}`,
271
+ auth,
272
+ response: ListResponse,
273
+ domainErrors: requestErrors,
274
+ });
275
+ });
276
+ const listAll = (options = {}) => Stream.paginate(undefined, (cursor) => Effect.map(list({ ...options, cursor }), (page) => {
277
+ const next = page.hasMore ? page.cursor : Option.none();
278
+ return [page.blobs, next];
279
+ }));
280
+ const deleteUrls = (operation, urls, ifMatch) => requester.call({
281
+ operation,
282
+ method: "POST",
283
+ path: "/delete",
284
+ auth,
285
+ json: { urls },
286
+ headers: ifMatch ? { "x-if-match": ifMatch } : undefined,
287
+ domainErrors: deleteErrors,
288
+ });
289
+ const del = Effect.fn("BlobStore.del")(function* (blob, options) {
290
+ return yield* deleteUrls("BlobStore.del", [locatorString(blob)], options?.ifMatch);
291
+ });
292
+ const delMany = Effect.fn("BlobStore.delMany")(function* (blobs) {
293
+ return yield* requester.call({
294
+ operation: "BlobStore.delMany",
295
+ method: "POST",
296
+ path: "/delete",
297
+ auth,
298
+ json: { urls: blobs.map(locatorString) },
299
+ domainErrors: requestErrors,
300
+ });
301
+ });
302
+ const copy = Effect.fn("BlobStore.copy")(function* (from, to, options) {
303
+ const fromUrl = locatorString(from);
304
+ const query = new URLSearchParams({ pathname: to, fromUrl });
305
+ return yield* requester.call({
306
+ operation: "BlobStore.copy",
307
+ method: "PUT",
308
+ path: `?${query.toString()}`,
309
+ auth,
310
+ response: PutBlobResponse,
311
+ headers: copyWriteHeaders(options),
312
+ locator: fromUrl,
313
+ domainErrors: copyErrors,
314
+ });
315
+ });
316
+ const rename = Effect.fn("BlobStore.rename")(function* (from, to, options) {
317
+ const fromUrl = locatorString(from);
318
+ const query = new URLSearchParams({ pathname: to, fromUrl });
319
+ return yield* requester.call({
320
+ operation: "BlobStore.rename",
321
+ method: "POST",
322
+ path: `/rename?${query.toString()}`,
323
+ auth,
324
+ response: PutBlobResponse,
325
+ headers: copyWriteHeaders(options),
326
+ locator: fromUrl,
327
+ domainErrors: copyErrors,
328
+ });
329
+ });
330
+ const createFolder = Effect.fn("BlobStore.createFolder")(function* (pathname, options) {
331
+ const folder = pathname.endsWith("/") ? pathname : `${pathname}/`;
332
+ const query = new URLSearchParams({ pathname: folder });
333
+ return yield* requester.call({
334
+ operation: "BlobStore.createFolder",
335
+ method: "PUT",
336
+ path: `/?${query.toString()}`,
337
+ auth,
338
+ response: CreateFolderResponse,
339
+ headers: {
340
+ "x-vercel-blob-access": options?.access ?? "public",
341
+ "x-add-random-suffix": "0",
342
+ },
343
+ locator: folder,
344
+ domainErrors: writeErrors,
345
+ });
346
+ });
347
+ return BlobStore.of({
348
+ put,
349
+ putImage,
350
+ head,
351
+ get,
352
+ list,
353
+ listAll,
354
+ del,
355
+ delMany,
356
+ copy,
357
+ rename,
358
+ createFolder,
359
+ createMultipartUpload: multipart.createMultipartUpload,
360
+ uploadPart: multipart.uploadPart,
361
+ completeMultipartUpload: multipart.completeMultipartUpload,
362
+ });
363
+ }));
364
+ //# sourceMappingURL=blob-store-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-store-live.js","sourceRoot":"","sources":["../../src/implementation/blob-store-live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { VercelSystemEnv } from "@panorama-industries/effect-vercel-core";
2
+ import { Layer } from "effect";
3
+ import { BlobConfig } from "../contracts/blob-config.ts";
4
+ import { BlobUploads } from "../contracts/blob-uploads.ts";
5
+ /**
6
+ * Implements {@link BlobUploads} with the store's read-write token from `BlobConfig` (client tokens
7
+ * and their callbacks) and `BlobConfig.webhookPublicKey` (presigned callbacks). Callback URLs are
8
+ * derived from `BlobConfig.callbackBaseUrl` and `VercelSystemEnv`; the time comes from `Clock`.
9
+ */
10
+ export declare const BlobUploadsLive: Layer.Layer<BlobUploads, never, BlobConfig | VercelSystemEnv>;
11
+ //# sourceMappingURL=blob-uploads-live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-uploads-live.d.ts","sourceRoot":"","sources":["../../src/implementation/blob-uploads-live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAA2B,KAAK,EAA4B,MAAM,QAAQ,CAAC;AAUlF,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAUzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAoI3D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,CAuKvF,CAAC"}
@@ -0,0 +1,218 @@
1
+ import { VercelSystemEnv } from "@panorama-industries/effect-vercel-core";
2
+ import { Clock, DateTime, Effect, Layer, Option, Redacted, Schema } from "effect";
3
+ import { HttpServerRequest, HttpServerResponse } from "effect/http";
4
+ import { BlobConfig } from "../contracts/blob-config.js";
5
+ import { UploadCompleted, UploadRequest } from "../contracts/blob-domain.js";
6
+ import { BlobReadWriteTokenRequired, BlobUploadEventRejected, EventMalformed, SignatureInvalid, SignatureMissing, WebhookPublicKeyMissing, } from "../contracts/blob-errors.js";
7
+ import { BlobUploads } from "../contracts/blob-uploads.js";
8
+ import { callbackSignatureHeader, deriveCallbackUrl, parseCallbackBody, resolveCallbackUrl, verifyEd25519CallbackSignature, verifyHmacCallbackSignature, } from "../internal/callback.js";
9
+ import { clientTokenPayloadJson, contradictsIfMatch, defaultClientTokenLifetimeMillis, ifMatchContradictionMessage, signClientToken, } from "../internal/client-token.js";
10
+ import { presignPayload } from "../internal/presign.js";
11
+ import { storeIdFromReadWriteToken } from "../internal/store-id.js";
12
+ import { PutBlobResponse } from "../internal/wire.js";
13
+ /** How long a client token issued by an upload route stays valid by default, as the SDK. */
14
+ const uploadRouteTokenLifetimeMillis = 60 * 60 * 1000;
15
+ const generateClientTokenEvent = "blob.generate-client-token";
16
+ const generatePresignedUrlEvent = "blob.generate-presigned-url";
17
+ const uploadCompletedEvent = "blob.upload-completed";
18
+ /** What the browser sends to start an upload; extra fields (such as a `callbackUrl`) are ignored. */
19
+ const UploadRequestPayload = Schema.Struct({
20
+ pathname: Schema.String,
21
+ clientPayload: Schema.OptionFromOptionalNullOr(Schema.String),
22
+ multipart: Schema.Boolean.pipe(Schema.withDecodingDefaultKey(Effect.succeed(false))),
23
+ }).pipe(Schema.decodeTo(UploadRequest));
24
+ /** The `payload` of `blob.upload-completed`. */
25
+ const UploadCompletedPayload = Schema.Struct({
26
+ blob: PutBlobResponse,
27
+ tokenPayload: Schema.OptionFromOptionalNullOr(Schema.String),
28
+ }).pipe(Schema.decodeTo(UploadCompleted));
29
+ const UploadRouteEvent = Schema.Struct({
30
+ type: Schema.Literals([generateClientTokenEvent, uploadCompletedEvent]),
31
+ payload: Schema.Unknown,
32
+ });
33
+ const PresignedRouteEvent = Schema.Struct({
34
+ type: Schema.Literals([generatePresignedUrlEvent, uploadCompletedEvent]),
35
+ payload: Schema.Unknown,
36
+ });
37
+ const rejected = (reason) => new BlobUploadEventRejected({ reason });
38
+ const malformed = (message) => rejected(new EventMalformed({ message }));
39
+ const decodeOrReject = (schema, input) => Schema.decodeUnknownEffect(schema)(input).pipe(Effect.mapError((error) => malformed(error.message)));
40
+ /**
41
+ * The request's body as the SDK receives it (`await request.json()`), and as callback signatures
42
+ * cover it. A body that cannot be read or is not JSON is `EventMalformed`.
43
+ */
44
+ const readEvent = (schema) => Effect.gen(function* () {
45
+ const request = yield* HttpServerRequest.HttpServerRequest;
46
+ const text = yield* request.text.pipe(Effect.mapError(() => malformed("The request body could not be read.")));
47
+ const body = yield* Option.match(parseCallbackBody(text), {
48
+ onNone: () => Effect.fail(malformed("The request body is not JSON.")),
49
+ onSome: Effect.succeed,
50
+ });
51
+ const event = yield* Schema.decodeUnknownEffect(schema)(body.json).pipe(Effect.mapError(() => malformed("Invalid event type")));
52
+ return { request, event, normalizedBody: body.normalized };
53
+ });
54
+ const signatureOf = (request) => Effect.gen(function* () {
55
+ const signature = request.headers[callbackSignatureHeader] ?? "";
56
+ if (signature === "") {
57
+ return yield* rejected(new SignatureMissing());
58
+ }
59
+ return signature;
60
+ });
61
+ /**
62
+ * Fields of a client token or route authorization in wire form and in the caller's key order,
63
+ * which the SDK serializes as given: `validUntil` becomes epoch milliseconds, unknown keys are
64
+ * dropped.
65
+ */
66
+ const wireFields = (options, keys, except) => {
67
+ const fields = {};
68
+ for (const [key, value] of Object.entries(options)) {
69
+ if (!keys.has(key) || key === except)
70
+ continue;
71
+ fields[key] =
72
+ key === "validUntil" && DateTime.isDateTime(value) ? DateTime.toEpochMillis(value) : value;
73
+ }
74
+ return fields;
75
+ };
76
+ const constraintKeys = [
77
+ "maximumSizeInBytes",
78
+ "allowedContentTypes",
79
+ "validUntil",
80
+ "addRandomSuffix",
81
+ "allowOverwrite",
82
+ "cacheControlMaxAge",
83
+ "ifMatch",
84
+ ];
85
+ const clientTokenOptionKeys = new Set([
86
+ "pathname",
87
+ "onUploadCompleted",
88
+ ...constraintKeys,
89
+ ]);
90
+ const uploadAuthorizationKeys = new Set([
91
+ "tokenPayload",
92
+ "callbackUrl",
93
+ ...constraintKeys,
94
+ ]);
95
+ /**
96
+ * Implements {@link BlobUploads} with the store's read-write token from `BlobConfig` (client tokens
97
+ * and their callbacks) and `BlobConfig.webhookPublicKey` (presigned callbacks). Callback URLs are
98
+ * derived from `BlobConfig.callbackBaseUrl` and `VercelSystemEnv`; the time comes from `Clock`.
99
+ */
100
+ export const BlobUploadsLive = Layer.effect(BlobUploads, Effect.gen(function* () {
101
+ const config = yield* BlobConfig;
102
+ const systemEnv = yield* VercelSystemEnv;
103
+ const readWriteToken = (operation) => Option.match(config.readWriteToken, {
104
+ onNone: () => Effect.fail(new BlobReadWriteTokenRequired({ operation })),
105
+ onSome: (token) => Effect.succeed(Redacted.value(token)),
106
+ });
107
+ /** The SDK's `generateClientTokenFromReadWriteToken`, over fields already in wire form. */
108
+ const signFields = Effect.fnUntraced(function* (token, fields, now) {
109
+ if (contradictsIfMatch(fields)) {
110
+ return yield* Effect.die(new Error(ifMatchContradictionMessage));
111
+ }
112
+ const storeId = storeIdFromReadWriteToken(token);
113
+ if (Option.isNone(storeId)) {
114
+ return yield* Effect.die(new Error("Invalid `BLOB_READ_WRITE_TOKEN`"));
115
+ }
116
+ const payload = clientTokenPayloadJson(fields, now + defaultClientTokenLifetimeMillis);
117
+ return yield* signClientToken(token, storeId.value, payload);
118
+ });
119
+ const callbackUrlFor = (request, provided, handlesCallback) => resolveCallbackUrl({
120
+ provided,
121
+ handlesCallback,
122
+ derive: deriveCallbackUrl({
123
+ requestUrl: request.originalUrl,
124
+ callbackBaseUrl: config.callbackBaseUrl,
125
+ env: systemEnv,
126
+ }),
127
+ });
128
+ const generateClientToken = Effect.fn("BlobUploads.generateClientToken")(function* (options) {
129
+ const token = yield* readWriteToken("BlobUploads.generateClientToken");
130
+ const now = yield* Clock.currentTimeMillis;
131
+ return yield* signFields(token, wireFields(options, clientTokenOptionKeys), now);
132
+ });
133
+ const handler = Effect.fn("BlobUploads.handler")(function* (options) {
134
+ const token = yield* readWriteToken("BlobUploads.handler");
135
+ const { request, event, normalizedBody } = yield* readEvent(UploadRouteEvent);
136
+ switch (event.type) {
137
+ case "blob.generate-client-token": {
138
+ const uploadRequest = yield* decodeOrReject(UploadRequestPayload, event.payload);
139
+ const authorization = yield* options.onBeforeGenerateToken(uploadRequest);
140
+ const tokenPayload = authorization.tokenPayload ?? Option.getOrNull(uploadRequest.clientPayload);
141
+ const callbackUrl = yield* callbackUrlFor(request, authorization.callbackUrl, options.onUploadCompleted !== undefined);
142
+ const now = yield* Clock.currentTimeMillis;
143
+ const validUntil = authorization.validUntil === undefined
144
+ ? now + uploadRouteTokenLifetimeMillis
145
+ : DateTime.toEpochMillis(authorization.validUntil);
146
+ const clientToken = yield* signFields(token, {
147
+ ...wireFields(authorization, uploadAuthorizationKeys, "callbackUrl"),
148
+ pathname: uploadRequest.pathname,
149
+ onUploadCompleted: Option.match(callbackUrl, {
150
+ onNone: () => undefined,
151
+ onSome: (url) => ({ callbackUrl: url, tokenPayload }),
152
+ }),
153
+ validUntil,
154
+ }, now);
155
+ return HttpServerResponse.jsonUnsafe({ type: event.type, clientToken });
156
+ }
157
+ case "blob.upload-completed": {
158
+ const signature = yield* signatureOf(request);
159
+ const verified = yield* verifyHmacCallbackSignature(token, signature, normalizedBody);
160
+ if (!verified) {
161
+ return yield* rejected(new SignatureInvalid());
162
+ }
163
+ if (options.onUploadCompleted !== undefined) {
164
+ const completed = yield* decodeOrReject(UploadCompletedPayload, event.payload);
165
+ yield* options.onUploadCompleted(completed);
166
+ }
167
+ return HttpServerResponse.jsonUnsafe({ type: event.type, response: "ok" });
168
+ }
169
+ }
170
+ });
171
+ const presignedHandler = Effect.fn("BlobUploads.presignedHandler")(function* (options) {
172
+ if (Option.isNone(config.webhookPublicKey)) {
173
+ return yield* rejected(new WebhookPublicKeyMissing());
174
+ }
175
+ const webhookPublicKey = config.webhookPublicKey.value;
176
+ const { request, event, normalizedBody } = yield* readEvent(PresignedRouteEvent);
177
+ switch (event.type) {
178
+ case "blob.generate-presigned-url": {
179
+ const uploadRequest = yield* decodeOrReject(UploadRequestPayload, event.payload);
180
+ const { token, urlOptions = {} } = yield* options.getSignedToken(uploadRequest);
181
+ const { callbackUrl: providedCallbackUrl, tokenPayload, ...putOptions } = urlOptions;
182
+ const callbackTokenPayload = tokenPayload ?? Option.getOrUndefined(uploadRequest.clientPayload);
183
+ const callbackUrl = yield* callbackUrlFor(request, providedCallbackUrl, options.onUploadCompleted !== undefined);
184
+ const payload = yield* presignPayload(token, {
185
+ ...putOptions,
186
+ onUploadCompleted: Option.match(callbackUrl, {
187
+ onNone: () => undefined,
188
+ onSome: (url) => ({ callbackUrl: url, tokenPayload: callbackTokenPayload }),
189
+ }),
190
+ operation: "put",
191
+ pathname: uploadRequest.pathname,
192
+ }, yield* Clock.currentTimeMillis);
193
+ return HttpServerResponse.jsonUnsafe({
194
+ type: event.type,
195
+ presignedUrlPayload: {
196
+ delegationToken: payload.delegationToken,
197
+ signature: payload.signature,
198
+ params: payload.params,
199
+ },
200
+ });
201
+ }
202
+ case "blob.upload-completed": {
203
+ const signature = yield* signatureOf(request);
204
+ const verified = yield* verifyEd25519CallbackSignature(webhookPublicKey, signature, normalizedBody);
205
+ if (!verified) {
206
+ return yield* rejected(new SignatureInvalid());
207
+ }
208
+ if (options.onUploadCompleted !== undefined) {
209
+ const completed = yield* decodeOrReject(UploadCompletedPayload, event.payload);
210
+ yield* options.onUploadCompleted(completed);
211
+ }
212
+ return HttpServerResponse.jsonUnsafe({ type: event.type, response: "ok" });
213
+ }
214
+ }
215
+ });
216
+ return BlobUploads.of({ generateClientToken, handler, presignedHandler });
217
+ }));
218
+ //# sourceMappingURL=blob-uploads-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-uploads-live.js","sourceRoot":"","sources":["../../src/implementation/blob-uploads-live.ts"],"names":[],"mappings":"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"}