@electric-sql/client
Version:
Postgres everywhere - your data, in sync, wherever you need it.
126 lines (111 loc) • 3.4 kB
text/typescript
export class FetchError extends Error {
status: number
text?: string
json?: object
headers: Record<string, string>
constructor(
status: number,
text: string | undefined,
json: object | undefined,
headers: Record<string, string>,
public url: string,
message?: string
) {
super(
message ||
`HTTP Error ${status} at ${url}: ${text ?? JSON.stringify(json)}`
)
this.name = `FetchError`
this.status = status
this.text = text
this.json = json
this.headers = headers
}
static async fromResponse(
response: Response,
url: string
): Promise<FetchError> {
const status = response.status
const headers = Object.fromEntries([...response.headers.entries()])
let text: string | undefined = undefined
let json: object | undefined = undefined
const contentType = response.headers.get(`content-type`)
if (!response.bodyUsed) {
if (contentType && contentType.includes(`application/json`)) {
json = (await response.json()) as object
} else {
text = await response.text()
}
}
return new FetchError(status, text, json, headers, url)
}
}
export class FetchBackoffAbortError extends Error {
constructor() {
super(`Fetch with backoff aborted`)
this.name = `FetchBackoffAbortError`
}
}
export class InvalidShapeOptionsError extends Error {
constructor(message: string) {
super(message)
this.name = `InvalidShapeOptionsError`
}
}
export class MissingShapeUrlError extends Error {
constructor() {
super(`Invalid shape options: missing required url parameter`)
this.name = `MissingShapeUrlError`
}
}
export class InvalidSignalError extends Error {
constructor() {
super(`Invalid signal option. It must be an instance of AbortSignal.`)
this.name = `InvalidSignalError`
}
}
export class MissingShapeHandleError extends Error {
constructor() {
super(
`shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)`
)
this.name = `MissingShapeHandleError`
}
}
export class ReservedParamError extends Error {
constructor(reservedParams: string[]) {
super(
`Cannot use reserved Electric parameter names in custom params: ${reservedParams.join(`, `)}`
)
this.name = `ReservedParamError`
}
}
export class ParserNullValueError extends Error {
constructor(columnName: string) {
super(`Column "${columnName ?? `unknown`}" does not allow NULL values`)
this.name = `ParserNullValueError`
}
}
export class ShapeStreamAlreadyRunningError extends Error {
constructor() {
super(`ShapeStream is already running`)
this.name = `ShapeStreamAlreadyRunningError`
}
}
export class MissingHeadersError extends Error {
constructor(url: string, missingHeaders: Array<string>) {
let msg = `The response for the shape request to ${url} didn't include the following required headers:\n`
missingHeaders.forEach((h) => {
msg += `- ${h}\n`
})
msg += `\nThis is often due to a proxy not setting CORS correctly so that all Electric headers can be read by the client.`
msg += `\nFor more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`
super(msg)
}
}
export class StaleCacheError extends Error {
constructor(message: string) {
super(message)
this.name = `StaleCacheError`
}
}