| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import { Schema } from "effect"
- import type {
- CassetteMetadata,
- HttpInteraction,
- RequestSnapshot,
- ResponseSnapshot,
- WebSocketEvent,
- WebSocketInteraction,
- } from "./types.js"
- export type {
- CassetteMetadata,
- HttpInteraction,
- RequestSnapshot,
- ResponseSnapshot,
- WebSocketEvent,
- WebSocketInteraction,
- } from "./types.js"
- export const RequestSnapshotSchema = Schema.Struct({
- method: Schema.String,
- url: Schema.String,
- headers: Schema.Record(Schema.String, Schema.String),
- body: Schema.String,
- })
- export const ResponseSnapshotSchema = Schema.Struct({
- status: Schema.Number,
- headers: Schema.Record(Schema.String, Schema.String),
- body: Schema.String,
- bodyEncoding: Schema.optional(Schema.Literals(["text", "base64"])),
- })
- export const CassetteMetadataSchema = Schema.Record(Schema.String, Schema.Unknown)
- export const HttpInteractionSchema = Schema.Struct({
- transport: Schema.tag("http"),
- request: RequestSnapshotSchema,
- response: ResponseSnapshotSchema,
- })
- export const WebSocketEventSchema = Schema.Union([
- Schema.Struct({
- direction: Schema.Literals(["client", "server"]),
- kind: Schema.tag("text"),
- body: Schema.String,
- }),
- Schema.Struct({
- direction: Schema.Literals(["client", "server"]),
- kind: Schema.tag("binary"),
- body: Schema.String,
- bodyEncoding: Schema.Literal("base64"),
- }),
- ])
- export const WebSocketInteractionSchema = Schema.Struct({
- transport: Schema.tag("websocket"),
- open: Schema.Struct({
- url: Schema.String,
- headers: Schema.Record(Schema.String, Schema.String),
- }),
- events: Schema.Array(WebSocketEventSchema),
- })
- export const InteractionSchema = Schema.Union([HttpInteractionSchema, WebSocketInteractionSchema]).pipe(
- Schema.toTaggedUnion("transport"),
- )
- export type Interaction = Schema.Schema.Type<typeof InteractionSchema>
- export const isHttpInteraction = InteractionSchema.guards.http
- export const isWebSocketInteraction = InteractionSchema.guards.websocket
- export const httpInteractions = (interactions: ReadonlyArray<Interaction>) => interactions.filter(isHttpInteraction)
- export const webSocketInteractions = (interactions: ReadonlyArray<Interaction>) =>
- interactions.filter(isWebSocketInteraction)
- export const CassetteSchema = Schema.Struct({
- version: Schema.Literal(1),
- metadata: Schema.optional(CassetteMetadataSchema),
- interactions: Schema.Array(InteractionSchema),
- })
- export type Cassette = Schema.Schema.Type<typeof CassetteSchema>
- export const decodeCassette = Schema.decodeUnknownSync(CassetteSchema)
- export const encodeCassette = Schema.encodeSync(CassetteSchema)
|