You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
6.5 KiB
222 lines
6.5 KiB
export type Mode = 'text' | 'binary'
|
|
|
|
export const enum MessageName {
|
|
parseComplete = 'parseComplete',
|
|
bindComplete = 'bindComplete',
|
|
closeComplete = 'closeComplete',
|
|
noData = 'noData',
|
|
portalSuspended = 'portalSuspended',
|
|
replicationStart = 'replicationStart',
|
|
emptyQuery = 'emptyQuery',
|
|
copyDone = 'copyDone',
|
|
copyData = 'copyData',
|
|
rowDescription = 'rowDescription',
|
|
parameterStatus = 'parameterStatus',
|
|
backendKeyData = 'backendKeyData',
|
|
notification = 'notification',
|
|
readyForQuery = 'readyForQuery',
|
|
commandComplete = 'commandComplete',
|
|
dataRow = 'dataRow',
|
|
copyInResponse = 'copyInResponse',
|
|
copyOutResponse = 'copyOutResponse',
|
|
authenticationOk = 'authenticationOk',
|
|
authenticationMD5Password = 'authenticationMD5Password',
|
|
authenticationCleartextPassword = 'authenticationCleartextPassword',
|
|
authenticationSASL = 'authenticationSASL',
|
|
authenticationSASLContinue = 'authenticationSASLContinue',
|
|
authenticationSASLFinal = 'authenticationSASLFinal',
|
|
error = 'error',
|
|
notice = 'notice',
|
|
}
|
|
|
|
export interface BackendMessage {
|
|
name: MessageName
|
|
length: number
|
|
}
|
|
|
|
export const parseComplete: BackendMessage = {
|
|
name: MessageName.parseComplete,
|
|
length: 5,
|
|
}
|
|
|
|
export const bindComplete: BackendMessage = {
|
|
name: MessageName.bindComplete,
|
|
length: 5,
|
|
}
|
|
|
|
export const closeComplete: BackendMessage = {
|
|
name: MessageName.closeComplete,
|
|
length: 5,
|
|
}
|
|
|
|
export const noData: BackendMessage = {
|
|
name: MessageName.noData,
|
|
length: 5,
|
|
}
|
|
|
|
export const portalSuspended: BackendMessage = {
|
|
name: MessageName.portalSuspended,
|
|
length: 5,
|
|
}
|
|
|
|
export const replicationStart: BackendMessage = {
|
|
name: MessageName.replicationStart,
|
|
length: 4,
|
|
}
|
|
|
|
export const emptyQuery: BackendMessage = {
|
|
name: MessageName.emptyQuery,
|
|
length: 4,
|
|
}
|
|
|
|
export const copyDone: BackendMessage = {
|
|
name: MessageName.copyDone,
|
|
length: 4,
|
|
}
|
|
|
|
interface NoticeOrError {
|
|
message: string | undefined
|
|
severity: string | undefined
|
|
code: string | undefined
|
|
detail: string | undefined
|
|
hint: string | undefined
|
|
position: string | undefined
|
|
internalPosition: string | undefined
|
|
internalQuery: string | undefined
|
|
where: string | undefined
|
|
schema: string | undefined
|
|
table: string | undefined
|
|
column: string | undefined
|
|
dataType: string | undefined
|
|
constraint: string | undefined
|
|
file: string | undefined
|
|
line: string | undefined
|
|
routine: string | undefined
|
|
}
|
|
|
|
export class DatabaseError extends Error implements NoticeOrError {
|
|
public severity: string | undefined
|
|
public code: string | undefined
|
|
public detail: string | undefined
|
|
public hint: string | undefined
|
|
public position: string | undefined
|
|
public internalPosition: string | undefined
|
|
public internalQuery: string | undefined
|
|
public where: string | undefined
|
|
public schema: string | undefined
|
|
public table: string | undefined
|
|
public column: string | undefined
|
|
public dataType: string | undefined
|
|
public constraint: string | undefined
|
|
public file: string | undefined
|
|
public line: string | undefined
|
|
public routine: string | undefined
|
|
constructor(message: string, public readonly length: number, public readonly name: MessageName) {
|
|
super(message)
|
|
}
|
|
}
|
|
|
|
export class CopyDataMessage {
|
|
public readonly name = MessageName.copyData
|
|
constructor(public readonly length: number, public readonly chunk: Buffer) {}
|
|
}
|
|
|
|
export class CopyResponse {
|
|
public readonly columnTypes: number[]
|
|
constructor(
|
|
public readonly length: number,
|
|
public readonly name: MessageName,
|
|
public readonly binary: boolean,
|
|
columnCount: number
|
|
) {
|
|
this.columnTypes = new Array(columnCount)
|
|
}
|
|
}
|
|
|
|
export class Field {
|
|
constructor(
|
|
public readonly name: string,
|
|
public readonly tableID: number,
|
|
public readonly columnID: number,
|
|
public readonly dataTypeID: number,
|
|
public readonly dataTypeSize: number,
|
|
public readonly dataTypeModifier: number,
|
|
public readonly format: Mode
|
|
) {}
|
|
}
|
|
|
|
export class RowDescriptionMessage {
|
|
public readonly name: MessageName = MessageName.rowDescription
|
|
public readonly fields: Field[]
|
|
constructor(public readonly length: number, public readonly fieldCount: number) {
|
|
this.fields = new Array(this.fieldCount)
|
|
}
|
|
}
|
|
|
|
export class ParameterStatusMessage {
|
|
public readonly name: MessageName = MessageName.parameterStatus
|
|
constructor(
|
|
public readonly length: number,
|
|
public readonly parameterName: string,
|
|
public readonly parameterValue: string
|
|
) {}
|
|
}
|
|
|
|
export class AuthenticationMD5Password implements BackendMessage {
|
|
public readonly name: MessageName = MessageName.authenticationMD5Password
|
|
constructor(public readonly length: number, public readonly salt: Buffer) {}
|
|
}
|
|
|
|
export class BackendKeyDataMessage {
|
|
public readonly name: MessageName = MessageName.backendKeyData
|
|
constructor(public readonly length: number, public readonly processID: number, public readonly secretKey: number) {}
|
|
}
|
|
|
|
export class NotificationResponseMessage {
|
|
public readonly name: MessageName = MessageName.notification
|
|
constructor(
|
|
public readonly length: number,
|
|
public readonly processId: number,
|
|
public readonly channel: string,
|
|
public readonly payload: string
|
|
) {}
|
|
}
|
|
|
|
export class ReadyForQueryMessage {
|
|
public readonly name: MessageName = MessageName.readyForQuery
|
|
constructor(public readonly length: number, public readonly status: string) {}
|
|
}
|
|
|
|
export class CommandCompleteMessage {
|
|
public readonly name: MessageName = MessageName.commandComplete
|
|
constructor(public readonly length: number, public readonly text: string) {}
|
|
}
|
|
|
|
export class DataRowMessage {
|
|
public readonly fieldCount: number
|
|
public readonly name: MessageName = MessageName.dataRow
|
|
constructor(public length: number, public fields: any[]) {
|
|
this.fieldCount = fields.length
|
|
}
|
|
}
|
|
|
|
export class NoticeMessage implements BackendMessage, NoticeOrError {
|
|
constructor(public readonly length: number, public readonly message: string | undefined) {}
|
|
public readonly name = MessageName.notice
|
|
public severity: string | undefined
|
|
public code: string | undefined
|
|
public detail: string | undefined
|
|
public hint: string | undefined
|
|
public position: string | undefined
|
|
public internalPosition: string | undefined
|
|
public internalQuery: string | undefined
|
|
public where: string | undefined
|
|
public schema: string | undefined
|
|
public table: string | undefined
|
|
public column: string | undefined
|
|
public dataType: string | undefined
|
|
public constraint: string | undefined
|
|
public file: string | undefined
|
|
public line: string | undefined
|
|
public routine: string | undefined
|
|
}
|
|
|