87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
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)
|