@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.
- package/LICENSE +21 -0
- package/README.md +12 -1
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +8 -0
- package/dist/client.js.map +1 -0
- package/dist/contracts/blob-client.d.ts +67 -0
- package/dist/contracts/blob-client.d.ts.map +1 -0
- package/dist/contracts/blob-client.js +11 -0
- package/dist/contracts/blob-client.js.map +1 -0
- package/dist/contracts/blob-config.d.ts +114 -0
- package/dist/contracts/blob-config.d.ts.map +1 -0
- package/dist/contracts/blob-config.js +7 -0
- package/dist/contracts/blob-config.js.map +1 -0
- package/dist/contracts/blob-domain.d.ts +336 -0
- package/dist/contracts/blob-domain.d.ts.map +1 -0
- package/dist/contracts/blob-domain.js +152 -0
- package/dist/contracts/blob-domain.js.map +1 -0
- package/dist/contracts/blob-errors.d.ts +125 -0
- package/dist/contracts/blob-errors.d.ts.map +1 -0
- package/dist/contracts/blob-errors.js +114 -0
- package/dist/contracts/blob-errors.js.map +1 -0
- package/dist/contracts/blob-signed-urls.d.ts +83 -0
- package/dist/contracts/blob-signed-urls.d.ts.map +1 -0
- package/dist/contracts/blob-signed-urls.js +10 -0
- package/dist/contracts/blob-signed-urls.js.map +1 -0
- package/dist/contracts/blob-store.d.ts +153 -0
- package/dist/contracts/blob-store.d.ts.map +1 -0
- package/dist/contracts/blob-store.js +15 -0
- package/dist/contracts/blob-store.js.map +1 -0
- package/dist/contracts/blob-uploads.d.ts +101 -0
- package/dist/contracts/blob-uploads.d.ts.map +1 -0
- package/dist/contracts/blob-uploads.js +17 -0
- package/dist/contracts/blob-uploads.js.map +1 -0
- package/dist/implementation/blob-client-live.d.ts +37 -0
- package/dist/implementation/blob-client-live.d.ts.map +1 -0
- package/dist/implementation/blob-client-live.js +213 -0
- package/dist/implementation/blob-client-live.js.map +1 -0
- package/dist/implementation/blob-config-live.d.ts +49 -0
- package/dist/implementation/blob-config-live.d.ts.map +1 -0
- package/dist/implementation/blob-config-live.js +82 -0
- package/dist/implementation/blob-config-live.js.map +1 -0
- package/dist/implementation/blob-live.d.ts +16 -0
- package/dist/implementation/blob-live.d.ts.map +1 -0
- package/dist/implementation/blob-live.js +16 -0
- package/dist/implementation/blob-live.js.map +1 -0
- package/dist/implementation/blob-signed-urls-live.d.ts +12 -0
- package/dist/implementation/blob-signed-urls-live.d.ts.map +1 -0
- package/dist/implementation/blob-signed-urls-live.js +92 -0
- package/dist/implementation/blob-signed-urls-live.js.map +1 -0
- package/dist/implementation/blob-store-live.d.ts +18 -0
- package/dist/implementation/blob-store-live.d.ts.map +1 -0
- package/dist/implementation/blob-store-live.js +364 -0
- package/dist/implementation/blob-store-live.js.map +1 -0
- package/dist/implementation/blob-uploads-live.d.ts +11 -0
- package/dist/implementation/blob-uploads-live.d.ts.map +1 -0
- package/dist/implementation/blob-uploads-live.js +218 -0
- package/dist/implementation/blob-uploads-live.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/blob-errors.d.ts +79 -0
- package/dist/internal/blob-errors.d.ts.map +1 -0
- package/dist/internal/blob-errors.js +196 -0
- package/dist/internal/blob-errors.js.map +1 -0
- package/dist/internal/blob-request.d.ts +255 -0
- package/dist/internal/blob-request.d.ts.map +1 -0
- package/dist/internal/blob-request.js +291 -0
- package/dist/internal/blob-request.js.map +1 -0
- package/dist/internal/callback.d.ts +70 -0
- package/dist/internal/callback.d.ts.map +1 -0
- package/dist/internal/callback.js +141 -0
- package/dist/internal/callback.js.map +1 -0
- package/dist/internal/client-token.d.ts +65 -0
- package/dist/internal/client-token.d.ts.map +1 -0
- package/dist/internal/client-token.js +80 -0
- package/dist/internal/client-token.js.map +1 -0
- package/dist/internal/env.d.ts +34 -0
- package/dist/internal/env.d.ts.map +1 -0
- package/dist/internal/env.js +61 -0
- package/dist/internal/env.js.map +1 -0
- package/dist/internal/multipart.d.ts +110 -0
- package/dist/internal/multipart.d.ts.map +1 -0
- package/dist/internal/multipart.js +290 -0
- package/dist/internal/multipart.js.map +1 -0
- package/dist/internal/presign.d.ts +123 -0
- package/dist/internal/presign.d.ts.map +1 -0
- package/dist/internal/presign.js +345 -0
- package/dist/internal/presign.js.map +1 -0
- package/dist/internal/store-id.d.ts +38 -0
- package/dist/internal/store-id.d.ts.map +1 -0
- package/dist/internal/store-id.js +54 -0
- package/dist/internal/store-id.js.map +1 -0
- package/dist/internal/urls.d.ts +26 -0
- package/dist/internal/urls.d.ts.map +1 -0
- package/dist/internal/urls.js +33 -0
- package/dist/internal/urls.js.map +1 -0
- package/dist/internal/wire.d.ts +55 -0
- package/dist/internal/wire.d.ts.map +1 -0
- package/dist/internal/wire.js +64 -0
- package/dist/internal/wire.js.map +1 -0
- package/dist/internal/write-headers.d.ts +56 -0
- package/dist/internal/write-headers.d.ts.map +1 -0
- package/dist/internal/write-headers.js +82 -0
- package/dist/internal/write-headers.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-blob-store.d.ts +134 -0
- package/dist/testing/test-blob-store.d.ts.map +1 -0
- package/dist/testing/test-blob-store.js +718 -0
- package/dist/testing/test-blob-store.js.map +1 -0
- package/package.json +58 -4
- package/src/client.ts +11 -0
- package/src/contracts/blob-client.ts +121 -0
- package/src/contracts/blob-config.ts +64 -0
- package/src/contracts/blob-domain.ts +304 -0
- package/src/contracts/blob-errors.ts +161 -0
- package/src/contracts/blob-signed-urls.ts +112 -0
- package/src/contracts/blob-store.ts +258 -0
- package/src/contracts/blob-uploads.ts +151 -0
- package/src/implementation/blob-client-live.ts +387 -0
- package/src/implementation/blob-config-live.ts +145 -0
- package/src/implementation/blob-live.ts +30 -0
- package/src/implementation/blob-signed-urls-live.ts +121 -0
- package/src/implementation/blob-store-live.ts +528 -0
- package/src/implementation/blob-uploads-live.ts +326 -0
- package/src/index.ts +18 -0
- package/src/internal/blob-errors.ts +325 -0
- package/src/internal/blob-request.ts +617 -0
- package/src/internal/callback.ts +200 -0
- package/src/internal/client-token.ts +132 -0
- package/src/internal/env.ts +128 -0
- package/src/internal/multipart.ts +526 -0
- package/src/internal/presign.ts +477 -0
- package/src/internal/store-id.ts +69 -0
- package/src/internal/urls.ts +42 -0
- package/src/internal/wire.ts +80 -0
- package/src/internal/write-headers.ts +118 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/test-blob-store.ts +1136 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Config } from "effect";
|
|
2
|
+
import { Layer, Redacted } from "effect";
|
|
3
|
+
import type { BlobAccess, StoreId } from "../contracts/blob-domain.ts";
|
|
4
|
+
import { BlobConfig } from "../contracts/blob-config.ts";
|
|
5
|
+
/** Values that replace what {@link BlobConfigLive} reads from the environment. */
|
|
6
|
+
export interface BlobConfigOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Read-write token (`vercel_blob_rw_<storeId>_…`). Takes priority over OIDC and
|
|
9
|
+
* `BLOB_READ_WRITE_TOKEN`, and becomes `readWriteToken`.
|
|
10
|
+
*/
|
|
11
|
+
readonly token?: string | Redacted.Redacted<string> | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Store to address with the Vercel OIDC token, as `store_<id>` or `<id>`; replaces
|
|
14
|
+
* `BLOB_STORE_ID`. Ignored when `token` is given.
|
|
15
|
+
*/
|
|
16
|
+
readonly storeId?: string | undefined;
|
|
17
|
+
/** Blob API base URL; replaces `VERCEL_BLOB_API_URL`, for an emulator or a test server. */
|
|
18
|
+
readonly apiUrl?: URL | string | undefined;
|
|
19
|
+
/** Extra headers for every API request, merged over the environment's. */
|
|
20
|
+
readonly headers?: Readonly<Record<string, string>> | undefined;
|
|
21
|
+
/** Retries after the first attempt; replaces `VERCEL_BLOB_RETRIES`. */
|
|
22
|
+
readonly retries?: number | undefined;
|
|
23
|
+
/** Where `get` reads a store's blobs; see `BlobConfig.blobBaseUrl`. */
|
|
24
|
+
readonly blobBaseUrl?: ((storeId: StoreId, access: BlobAccess) => URL) | undefined;
|
|
25
|
+
/** Ed25519 public key (PEM) for presigned-upload callbacks; replaces `BLOB_WEBHOOK_PUBLIC_KEY`. */
|
|
26
|
+
readonly webhookPublicKey?: string | undefined;
|
|
27
|
+
/** Origin for upload-completed callbacks; replaces `VERCEL_BLOB_CALLBACK_URL`. */
|
|
28
|
+
readonly callbackBaseUrl?: string | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Builds {@link BlobConfig} from the environment, with any given values taking precedence.
|
|
32
|
+
*
|
|
33
|
+
* Credentials are resolved once, in the SDK's order: the `token` option; else OIDC when a store id
|
|
34
|
+
* is known (`storeId` option or `BLOB_STORE_ID`), keeping `BLOB_READ_WRITE_TOKEN` as the per-request
|
|
35
|
+
* fallback; else `BLOB_READ_WRITE_TOKEN`. Variables are trimmed and blank ones ignored.
|
|
36
|
+
*
|
|
37
|
+
* Fails with a `ConfigError` when no credentials are found, a read-write token has no store id
|
|
38
|
+
* (`vercel_blob_rw_<storeId>_…`), the store id, API URL or `VERCEL_BLOB_RETRIES` is invalid.
|
|
39
|
+
*/
|
|
40
|
+
export declare const blobConfigLayer: (options?: BlobConfigOptions) => Layer.Layer<BlobConfig, Config.ConfigError>;
|
|
41
|
+
/**
|
|
42
|
+
* Reads {@link BlobConfig} from the environment: `BLOB_READ_WRITE_TOKEN`, `BLOB_STORE_ID`,
|
|
43
|
+
* `VERCEL_BLOB_API_URL`, `VERCEL_BLOB_API_VERSION_OVERRIDE`, `VERCEL_BLOB_RETRIES` (default 10),
|
|
44
|
+
* `VERCEL_BLOB_USE_X_CONTENT_LENGTH`, `VERCEL_BLOB_PROXY_THROUGH_ALTERNATIVE_API`,
|
|
45
|
+
* `BLOB_WEBHOOK_PUBLIC_KEY` and `VERCEL_BLOB_CALLBACK_URL`. The API URL, API version and proxy
|
|
46
|
+
* variables also accept a `NEXT_PUBLIC_` prefix.
|
|
47
|
+
*/
|
|
48
|
+
export declare const BlobConfigLive: Layer.Layer<BlobConfig, Config.ConfigError>;
|
|
49
|
+
//# sourceMappingURL=blob-config-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-config-live.d.ts","sourceRoot":"","sources":["../../src/implementation/blob-config-live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAU,KAAK,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,EAAY,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAKnE,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAEhE;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAAC;IAE3C,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAEhE,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;IAEnF,mGAAmG;IACnG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,kFAAkF;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,aACjB,iBAAiB,KACzB,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CACS,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAqB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Effect, Layer, Option, Redacted } from "effect";
|
|
2
|
+
import { BlobAuth, BlobConfig } from "../contracts/blob-config.js";
|
|
3
|
+
import { configError, env, requestEnv } from "../internal/env.js";
|
|
4
|
+
import { parseStoreId, storeIdFromReadWriteToken } from "../internal/store-id.js";
|
|
5
|
+
import { defaultBlobBaseUrl } from "../internal/urls.js";
|
|
6
|
+
const noCredentials = configError("No blob credentials found. Pass a `token` option, set `BLOB_READ_WRITE_TOKEN`, or use Vercel " +
|
|
7
|
+
"OIDC with a `storeId` option or `BLOB_STORE_ID`.");
|
|
8
|
+
const invalidReadWriteToken = (source) => configError(`Invalid ${source}: expected a read-write token of the form vercel_blob_rw_<storeId>_<secret>.`);
|
|
9
|
+
const resolveBlobConfig = Effect.fnUntraced(function* (options) {
|
|
10
|
+
const { apiUrl, apiVersion, retries, sendContentLength, headers } = yield* requestEnv(options);
|
|
11
|
+
const envReadWriteToken = Option.map(yield* env("BLOB_READ_WRITE_TOKEN"), (token) => Redacted.make(token));
|
|
12
|
+
const readWriteStoreId = (token, source) => Option.match(storeIdFromReadWriteToken(Redacted.value(token)), {
|
|
13
|
+
onNone: () => Effect.fail(invalidReadWriteToken(source)),
|
|
14
|
+
onSome: Effect.succeed,
|
|
15
|
+
});
|
|
16
|
+
if (Option.isSome(envReadWriteToken)) {
|
|
17
|
+
yield* readWriteStoreId(envReadWriteToken.value, "BLOB_READ_WRITE_TOKEN");
|
|
18
|
+
}
|
|
19
|
+
const optionStoreId = Option.filter(Option.map(Option.fromUndefinedOr(options.storeId), (id) => id.trim()), (id) => id !== "");
|
|
20
|
+
const storeIdInput = Option.isSome(optionStoreId) ? optionStoreId : yield* env("BLOB_STORE_ID");
|
|
21
|
+
let auth;
|
|
22
|
+
let readWriteToken = envReadWriteToken;
|
|
23
|
+
if (options.token !== undefined) {
|
|
24
|
+
const token = Redacted.isRedacted(options.token) ? options.token : Redacted.make(options.token);
|
|
25
|
+
auth = BlobAuth.ReadWrite({ token, storeId: yield* readWriteStoreId(token, "token option") });
|
|
26
|
+
readWriteToken = Option.some(token);
|
|
27
|
+
}
|
|
28
|
+
else if (Option.isSome(storeIdInput)) {
|
|
29
|
+
const storeId = yield* Option.match(parseStoreId(storeIdInput.value), {
|
|
30
|
+
onNone: () => Effect.fail(configError(`Invalid store id "${storeIdInput.value}": expected store_<id> or <id> without whitespace or "_".`)),
|
|
31
|
+
onSome: Effect.succeed,
|
|
32
|
+
});
|
|
33
|
+
auth = BlobAuth.Oidc({ storeId });
|
|
34
|
+
}
|
|
35
|
+
else if (Option.isSome(envReadWriteToken)) {
|
|
36
|
+
auth = BlobAuth.ReadWrite({
|
|
37
|
+
token: envReadWriteToken.value,
|
|
38
|
+
storeId: yield* readWriteStoreId(envReadWriteToken.value, "BLOB_READ_WRITE_TOKEN"),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return yield* Effect.fail(noCredentials);
|
|
43
|
+
}
|
|
44
|
+
const webhookPublicKey = Option.isSome(Option.fromUndefinedOr(options.webhookPublicKey))
|
|
45
|
+
? Option.fromUndefinedOr(options.webhookPublicKey)
|
|
46
|
+
: yield* env("BLOB_WEBHOOK_PUBLIC_KEY");
|
|
47
|
+
const callbackBaseUrl = Option.isSome(Option.fromUndefinedOr(options.callbackBaseUrl))
|
|
48
|
+
? Option.fromUndefinedOr(options.callbackBaseUrl)
|
|
49
|
+
: yield* env("VERCEL_BLOB_CALLBACK_URL");
|
|
50
|
+
return BlobConfig.of({
|
|
51
|
+
apiUrl,
|
|
52
|
+
auth,
|
|
53
|
+
readWriteToken,
|
|
54
|
+
apiVersion,
|
|
55
|
+
retries,
|
|
56
|
+
sendContentLength,
|
|
57
|
+
headers,
|
|
58
|
+
blobBaseUrl: options.blobBaseUrl ?? defaultBlobBaseUrl,
|
|
59
|
+
webhookPublicKey,
|
|
60
|
+
callbackBaseUrl,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Builds {@link BlobConfig} from the environment, with any given values taking precedence.
|
|
65
|
+
*
|
|
66
|
+
* Credentials are resolved once, in the SDK's order: the `token` option; else OIDC when a store id
|
|
67
|
+
* is known (`storeId` option or `BLOB_STORE_ID`), keeping `BLOB_READ_WRITE_TOKEN` as the per-request
|
|
68
|
+
* fallback; else `BLOB_READ_WRITE_TOKEN`. Variables are trimmed and blank ones ignored.
|
|
69
|
+
*
|
|
70
|
+
* Fails with a `ConfigError` when no credentials are found, a read-write token has no store id
|
|
71
|
+
* (`vercel_blob_rw_<storeId>_…`), the store id, API URL or `VERCEL_BLOB_RETRIES` is invalid.
|
|
72
|
+
*/
|
|
73
|
+
export const blobConfigLayer = (options = {}) => Layer.effect(BlobConfig, resolveBlobConfig(options));
|
|
74
|
+
/**
|
|
75
|
+
* Reads {@link BlobConfig} from the environment: `BLOB_READ_WRITE_TOKEN`, `BLOB_STORE_ID`,
|
|
76
|
+
* `VERCEL_BLOB_API_URL`, `VERCEL_BLOB_API_VERSION_OVERRIDE`, `VERCEL_BLOB_RETRIES` (default 10),
|
|
77
|
+
* `VERCEL_BLOB_USE_X_CONTENT_LENGTH`, `VERCEL_BLOB_PROXY_THROUGH_ALTERNATIVE_API`,
|
|
78
|
+
* `BLOB_WEBHOOK_PUBLIC_KEY` and `VERCEL_BLOB_CALLBACK_URL`. The API URL, API version and proxy
|
|
79
|
+
* variables also accept a `NEXT_PUBLIC_` prefix.
|
|
80
|
+
*/
|
|
81
|
+
export const BlobConfigLive = blobConfigLayer();
|
|
82
|
+
//# sourceMappingURL=blob-config-live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-config-live.js","sourceRoot":"","sources":["../../src/implementation/blob-config-live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Config } from "effect";
|
|
2
|
+
import type { HttpClient } from "effect/http";
|
|
3
|
+
import { Layer } from "effect";
|
|
4
|
+
import type { BlobSignedUrls } from "../contracts/blob-signed-urls.ts";
|
|
5
|
+
import type { BlobStore } from "../contracts/blob-store.ts";
|
|
6
|
+
import type { BlobUploads } from "../contracts/blob-uploads.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Store, signed URLs and upload routes configured from the Vercel environment
|
|
9
|
+
* (`BLOB_READ_WRITE_TOKEN`, or the function's OIDC token with `BLOB_STORE_ID`). Provide an
|
|
10
|
+
* `HttpClient`, e.g. `FetchHttpClient.layer`.
|
|
11
|
+
*
|
|
12
|
+
* Compose the individual layers instead to override configuration (`blobConfigLayer`) or to
|
|
13
|
+
* refresh OIDC tokens in local development (`VercelOidcRefreshingLive`).
|
|
14
|
+
*/
|
|
15
|
+
export declare const BlobLive: Layer.Layer<BlobStore | BlobSignedUrls | BlobUploads, Config.ConfigError, HttpClient.HttpClient>;
|
|
16
|
+
//# sourceMappingURL=blob-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-live.d.ts","sourceRoot":"","sources":["../../src/implementation/blob-live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAOhE;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,KAAK,CAChC,SAAS,GAAG,cAAc,GAAG,WAAW,EACxC,MAAM,CAAC,WAAW,EAClB,UAAU,CAAC,UAAU,CAGtB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { VercelOidcLive, VercelSystemEnvLive } from "@panorama-industries/effect-vercel-core";
|
|
2
|
+
import { Layer } from "effect";
|
|
3
|
+
import { BlobConfigLive } from "./blob-config-live.js";
|
|
4
|
+
import { BlobSignedUrlsLive } from "./blob-signed-urls-live.js";
|
|
5
|
+
import { BlobStoreLive } from "./blob-store-live.js";
|
|
6
|
+
import { BlobUploadsLive } from "./blob-uploads-live.js";
|
|
7
|
+
/**
|
|
8
|
+
* Store, signed URLs and upload routes configured from the Vercel environment
|
|
9
|
+
* (`BLOB_READ_WRITE_TOKEN`, or the function's OIDC token with `BLOB_STORE_ID`). Provide an
|
|
10
|
+
* `HttpClient`, e.g. `FetchHttpClient.layer`.
|
|
11
|
+
*
|
|
12
|
+
* Compose the individual layers instead to override configuration (`blobConfigLayer`) or to
|
|
13
|
+
* refresh OIDC tokens in local development (`VercelOidcRefreshingLive`).
|
|
14
|
+
*/
|
|
15
|
+
export const BlobLive = Layer.mergeAll(BlobStoreLive, BlobSignedUrlsLive, BlobUploadsLive).pipe(Layer.provide(Layer.mergeAll(BlobConfigLive, VercelOidcLive, VercelSystemEnvLive)));
|
|
16
|
+
//# sourceMappingURL=blob-live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-live.js","sourceRoot":"","sources":["../../src/implementation/blob-live.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAIjB,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC,IAAI,CACzE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC,CACnF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { VercelOidc } from "@panorama-industries/effect-vercel-core";
|
|
2
|
+
import { Layer } from "effect";
|
|
3
|
+
import { HttpClient } from "effect/http";
|
|
4
|
+
import { BlobConfig } from "../contracts/blob-config.ts";
|
|
5
|
+
import { BlobSignedUrls } from "../contracts/blob-signed-urls.ts";
|
|
6
|
+
/**
|
|
7
|
+
* Implements {@link BlobSignedUrls}: `issueSignedToken` calls the Blob API with the server
|
|
8
|
+
* credentials of `BlobConfig` (OIDC or the read-write token); presigning is local and reads the
|
|
9
|
+
* current time from `Clock`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const BlobSignedUrlsLive: Layer.Layer<BlobSignedUrls, never, BlobConfig | HttpClient.HttpClient | VercelOidc>;
|
|
12
|
+
//# sourceMappingURL=blob-signed-urls-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-signed-urls-live.d.ts","sourceRoot":"","sources":["../../src/implementation/blob-signed-urls-live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,UAAU,EAAE,MAAM,yCAAyC,CAAC;AACpG,OAAO,EAA2B,KAAK,EAAkB,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AA0BlE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAC1C,cAAc,EACd,KAAK,EACL,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAwEhD,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ApiBadRequest, VercelApiError, VercelOidc } from "@panorama-industries/effect-vercel-core";
|
|
2
|
+
import { Clock, DateTime, Effect, Layer, Option, Schema } from "effect";
|
|
3
|
+
import { HttpClient } from "effect/http";
|
|
4
|
+
import { BlobConfig } from "../contracts/blob-config.js";
|
|
5
|
+
import { SignedToken } from "../contracts/blob-domain.js";
|
|
6
|
+
import { BlobPresignFailed } from "../contracts/blob-errors.js";
|
|
7
|
+
import { BlobSignedUrls } from "../contracts/blob-signed-urls.js";
|
|
8
|
+
import { blobRequester, blobRequestSettings, serverBlobAuth } from "../internal/blob-request.js";
|
|
9
|
+
import { presignedApiUrl, presignedBlobUrl, presignPayload } from "../internal/presign.js";
|
|
10
|
+
/** `POST /signed-token`; `validUntil` is in epoch milliseconds. */
|
|
11
|
+
const SignedTokenResponse = Schema.Struct({
|
|
12
|
+
delegationToken: Schema.String,
|
|
13
|
+
clientSigningToken: Schema.RedactedFromValue(Schema.String),
|
|
14
|
+
validUntil: Schema.DateTimeUtcFromMillis,
|
|
15
|
+
}).pipe(Schema.decodeTo(SignedToken));
|
|
16
|
+
/** The JSON body of `POST /signed-token`, with the SDK's keys in the SDK's order. */
|
|
17
|
+
const signedTokenBody = (options) => ({
|
|
18
|
+
...(options.pathname === undefined ? {} : { pathname: options.pathname }),
|
|
19
|
+
...(options.operations === undefined ? {} : { operations: [...new Set(options.operations)] }),
|
|
20
|
+
...(options.validUntil === undefined
|
|
21
|
+
? {}
|
|
22
|
+
: { validUntil: DateTime.toEpochMillis(options.validUntil) }),
|
|
23
|
+
...(options.maximumSizeInBytes === undefined
|
|
24
|
+
? {}
|
|
25
|
+
: { maximumSizeInBytes: options.maximumSizeInBytes }),
|
|
26
|
+
...(options.allowedContentTypes === undefined
|
|
27
|
+
? {}
|
|
28
|
+
: { allowedContentTypes: options.allowedContentTypes }),
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Implements {@link BlobSignedUrls}: `issueSignedToken` calls the Blob API with the server
|
|
32
|
+
* credentials of `BlobConfig` (OIDC or the read-write token); presigning is local and reads the
|
|
33
|
+
* current time from `Clock`.
|
|
34
|
+
*/
|
|
35
|
+
export const BlobSignedUrlsLive = Layer.effect(BlobSignedUrls, Effect.gen(function* () {
|
|
36
|
+
const config = yield* BlobConfig;
|
|
37
|
+
const httpClient = yield* HttpClient.HttpClient;
|
|
38
|
+
const oidc = yield* VercelOidc;
|
|
39
|
+
const requester = blobRequester(blobRequestSettings(config, httpClient));
|
|
40
|
+
const issueSignedToken = Effect.fn("BlobSignedUrls.issueSignedToken")(function* (options = {}) {
|
|
41
|
+
if (options.validUntil !== undefined) {
|
|
42
|
+
const now = yield* Clock.currentTimeMillis;
|
|
43
|
+
if (DateTime.toEpochMillis(options.validUntil) <= now) {
|
|
44
|
+
return yield* new VercelApiError({
|
|
45
|
+
operation: "BlobSignedUrls.issueSignedToken",
|
|
46
|
+
errorCode: Option.none(),
|
|
47
|
+
reason: new ApiBadRequest({
|
|
48
|
+
message: "`issueSignedToken`: validUntil must be in the future.",
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return yield* requester.call({
|
|
54
|
+
operation: "BlobSignedUrls.issueSignedToken",
|
|
55
|
+
method: "POST",
|
|
56
|
+
path: "/signed-token",
|
|
57
|
+
auth: serverBlobAuth(config, oidc),
|
|
58
|
+
json: signedTokenBody(options),
|
|
59
|
+
response: SignedTokenResponse,
|
|
60
|
+
domainErrors: ["BlobStoreUnavailable", "BlobOidcEnvironmentNotAllowed"],
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
const presign = Effect.fn("BlobSignedUrls.presign")(function* (token, options) {
|
|
64
|
+
return yield* presignPayload(token, options, yield* Clock.currentTimeMillis);
|
|
65
|
+
});
|
|
66
|
+
const presignUrl = Effect.fn("BlobSignedUrls.presignUrl")(function* (token, options) {
|
|
67
|
+
const payload = yield* presignPayload(token, options, yield* Clock.currentTimeMillis);
|
|
68
|
+
switch (options.operation) {
|
|
69
|
+
case "get":
|
|
70
|
+
case "head": {
|
|
71
|
+
const url = presignedBlobUrl({
|
|
72
|
+
pathnameOrUrl: options.pathname,
|
|
73
|
+
payload,
|
|
74
|
+
access: options.access,
|
|
75
|
+
useCache: options.operation === "get" ? options.useCache : undefined,
|
|
76
|
+
blobBaseUrl: config.blobBaseUrl,
|
|
77
|
+
});
|
|
78
|
+
if (Option.isNone(url)) {
|
|
79
|
+
return yield* new BlobPresignFailed({
|
|
80
|
+
message: "Delegation token payload is missing `storeId`.",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return url.value;
|
|
84
|
+
}
|
|
85
|
+
case "put":
|
|
86
|
+
case "delete":
|
|
87
|
+
return presignedApiUrl(config.apiUrl, options.pathname, payload);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return BlobSignedUrls.of({ issueSignedToken, presign, presignUrl });
|
|
91
|
+
}));
|
|
92
|
+
//# sourceMappingURL=blob-signed-urls-live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-signed-urls-live.js","sourceRoot":"","sources":["../../src/implementation/blob-signed-urls-live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VercelOidc } from "@panorama-industries/effect-vercel-core";
|
|
2
|
+
import { Layer } from "effect";
|
|
3
|
+
import { HttpClient } from "effect/http";
|
|
4
|
+
import { BlobConfig } from "../contracts/blob-config.ts";
|
|
5
|
+
import { BlobStore } from "../contracts/blob-store.ts";
|
|
6
|
+
/**
|
|
7
|
+
* Implements {@link BlobStore} over the Blob API with the SDK's wire protocol, retries and error
|
|
8
|
+
* mapping. Requires `BlobConfig`, an `HttpClient`, and `VercelOidc` (evaluated per request when
|
|
9
|
+
* `BlobConfig.auth` is OIDC).
|
|
10
|
+
*
|
|
11
|
+
* `get` reads from the blob's host. A URL locator must pass the SDK's `isAllowedBlobUrl` check (a
|
|
12
|
+
* `*.blob.vercel-storage.com` host, or the origin of an overridden API URL); any other URL, or a
|
|
13
|
+
* string that starts with `http(s)://` but does not parse, is a defect, as are an empty `get`
|
|
14
|
+
* locator and a `putImage` source `URL` that is not http(s). These are programming errors the SDK
|
|
15
|
+
* throws `BlobError` for.
|
|
16
|
+
*/
|
|
17
|
+
export declare const BlobStoreLive: Layer.Layer<BlobStore, never, BlobConfig | HttpClient.HttpClient | VercelOidc>;
|
|
18
|
+
//# sourceMappingURL=blob-store-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-store-live.d.ts","sourceRoot":"","sources":["../../src/implementation/blob-store-live.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,UAAU,EAEX,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAA2B,KAAK,EAAkB,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAW,UAAU,EAAE,MAAM,aAAa,CAAC;AA0BlD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA8HvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,KAAK,CACrC,SAAS,EACT,KAAK,EACL,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAyVhD,CAAC"}
|