EdgeAIG's picture
download
raw
6.47 kB
/**
* Defines a platform-independent service for cryptographic operations.
*
* Runtime packages provide concrete implementations backed by the host
* platform's cryptography APIs. This module defines the service interface and a
* constructor from random-byte and digest primitives. The service provides
* secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and
* SHA message digests.
*
* @since 4.0.0
*/
import * as Context from "./Context.ts";
import * as Effect from "./Effect.ts";
import * as PlatformError from "./PlatformError.ts";
declare const TypeId = "~effect/platform/Crypto";
/**
* Digest algorithms supported by the platform `Crypto` service.
*
* **Gotchas**
*
* SHA-1 is included for interoperability with existing protocols. Do not use
* SHA-1 for new security-sensitive designs.
*
* **Example** (Using a digest algorithm)
*
* ```ts
* import { Crypto } from "effect"
*
* const algorithm: Crypto.DigestAlgorithm = "SHA-256"
* ```
*
* @category models
* @since 4.0.0
*/
export type DigestAlgorithm = "SHA-1" | "SHA-256" | "SHA-384" | "SHA-512";
/**
* Platform-agnostic cryptographic operations.
*
* **Details**
*
* `Crypto` implementations must use cryptographically secure platform APIs.
* The random generator helpers are derived by the `make` constructor from
* the random methods on this service.
*
* **Example** (Using cryptographic operations)
*
* ```ts
* import { Crypto, Effect, Layer } from "effect"
*
* const TestCrypto = Layer.succeed(
* Crypto.Crypto,
* Crypto.make({
* randomBytes: (size) => new Uint8Array(size),
* digest: (_algorithm, data) => Effect.succeed(data)
* })
* )
*
* const program = Effect.gen(function*() {
* const crypto = yield* Crypto.Crypto
* const bytes = yield* crypto.randomBytes(16)
* const uuidv4 = yield* crypto.randomUUIDv4
* const uuidv7 = yield* crypto.randomUUIDv7
* const hash = yield* crypto.digest("SHA-256", bytes)
* return { uuidv4, uuidv7, hash }
* })
*
* Effect.runPromise(Effect.provide(program, TestCrypto))
* ```
*
* @category models
* @since 4.0.0
*/
export interface Crypto {
readonly [TypeId]: typeof TypeId;
/**
* Generates a random integer in the range Number.MIN_SAFE_INTEGER to
* Number.MAX_SAFE_INTEGER (both inclusive).
*/
nextIntUnsafe(): number;
/**
* Generates a random number in the range 0 (inclusive) to 1 (exclusive).
*/
nextDoubleUnsafe(): number;
/**
* Generates cryptographically secure random bytes.
*/
randomBytes(size: number): Effect.Effect<Uint8Array, PlatformError.PlatformError>;
/**
* Computes a cryptographic digest for the supplied data.
*/
digest(algorithm: DigestAlgorithm, data: Uint8Array): Effect.Effect<Uint8Array, PlatformError.PlatformError>;
/**
* Generates a cryptographically secure random number between 0 (inclusive)
* and 1 (exclusive).
*/
readonly random: Effect.Effect<number>;
/**
* Generates a cryptographically secure random boolean.
*/
readonly randomBoolean: Effect.Effect<boolean>;
/**
* Generates a cryptographically secure random integer between
* `Number.MIN_SAFE_INTEGER` and `Number.MAX_SAFE_INTEGER` (both inclusive).
*/
readonly randomInt: Effect.Effect<number>;
/**
* Generates a cryptographically secure random number between `min`
* (inclusive) and `max` (exclusive).
*/
randomBetween(min: number, max: number): Effect.Effect<number>;
/**
* Generates a cryptographically secure random integer between `min` and `max`.
*
* **Details**
*
* The lower bound is rounded up with `Math.ceil` and the upper bound is
* rounded down with `Math.floor`. By default the range is inclusive; set
* `options.halfOpen: true` to exclude the upper bound.
*/
randomIntBetween(min: number, max: number, options?: {
readonly halfOpen?: boolean | undefined;
}): Effect.Effect<number>;
/**
* Uses the cryptographically secure random generator to shuffle the supplied
* iterable.
*/
randomShuffle<A>(elements: Iterable<A>): Effect.Effect<Array<A>>;
/**
* Generates a cryptographically secure UUIDv4 string.
*/
readonly randomUUIDv4: Effect.Effect<string, PlatformError.PlatformError>;
/**
* Generates a cryptographically secure UUIDv7 string.
*/
readonly randomUUIDv7: Effect.Effect<string, PlatformError.PlatformError>;
}
/**
* Service tag for platform cryptography.
*
* **When to use**
*
* Use when you need to provide or retrieve the full platform cryptography
* service from an effect's context.
*
* **Details**
*
* Providing this service supplies platform-agnostic cryptographic operations
* such as hashing, UUID generation, and secure random values.
*
* @see {@link make} for constructing a Crypto service from primitive operations
*
* @category services
* @since 4.0.0
*/
export declare const Crypto: Context.Service<Crypto, Crypto>;
/**
* Creates a `Crypto` service from the primitive implementation, deriving the
* random generator helpers and UUID generation from those primitives.
*
* **When to use**
*
* Use to build a Crypto service for a platform integration, test layer, or
* custom runtime from primitive random-byte and digest operations.
*
* **Details**
*
* The constructor derives random numbers, booleans, integer ranges, shuffling,
* and UUID generation from `impl.randomBytes`. Digest operations delegate to
* `impl.digest`.
*
* **Gotchas**
*
* `impl.randomBytes` must return cryptographically secure bytes of the
* requested length. UUID formatting mutates the byte array returned for UUID
* generation, so the implementation should return a fresh array for each call.
*
* **Example** (Creating a Crypto service)
*
* ```ts
* import { Crypto, Effect, Layer } from "effect"
*
* const TestCrypto = Layer.succeed(
* Crypto.Crypto,
* Crypto.make({
* randomBytes: (size) => new Uint8Array(size),
* digest: (_algorithm, data) => Effect.succeed(data)
* })
* )
* ```
*
* @category constructors
* @since 4.0.0
*/
export declare const make: (impl: {
readonly randomBytes: (size: number) => Uint8Array;
readonly digest: (algorithm: DigestAlgorithm, data: Uint8Array) => Effect.Effect<Uint8Array, PlatformError.PlatformError>;
}) => Crypto;
export {};
//# sourceMappingURL=Crypto.d.ts.map

Xet Storage Details

Size:
6.47 kB
·
Xet hash:
a27d2c832501b7185d4a9f8d0f0f3b3fe109842c206ae5f99a2ceaea7ba3d0c6

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.