{"version":3,"sources":["../src/types.ts","../src/parse.ts","../../pg-protocol/src/messages.ts","../../pg-protocol/src/index.ts","../../pg-protocol/src/serializer.ts","../../pg-protocol/src/buffer-writer.ts","../../pg-protocol/src/string-utils.ts","../../pg-protocol/src/parser.ts","../../pg-protocol/src/types.ts","../../pg-protocol/src/buffer-reader.ts"],"sourcesContent":["/*\nBased on postgres.js types.js\nhttps://github.com/porsager/postgres/blob/master/src/types.js\nPublished under the Unlicense:\nhttps://github.com/porsager/postgres/blob/master/UNLICENSE \n*/\n\nimport type { ParserOptions } from './interface.js'\n\nconst JSON_parse = globalThis.JSON.parse\nconst JSON_stringify = globalThis.JSON.stringify\n\nexport const BOOL = 16,\n  BYTEA = 17,\n  CHAR = 18,\n  INT8 = 20,\n  INT2 = 21,\n  INT4 = 23,\n  REGPROC = 24,\n  TEXT = 25,\n  OID = 26,\n  TID = 27,\n  XID = 28,\n  CID = 29,\n  JSON = 114,\n  XML = 142,\n  PG_NODE_TREE = 194,\n  SMGR = 210,\n  PATH = 602,\n  POLYGON = 604,\n  CIDR = 650,\n  FLOAT4 = 700,\n  FLOAT8 = 701,\n  ABSTIME = 702,\n  RELTIME = 703,\n  TINTERVAL = 704,\n  CIRCLE = 718,\n  MACADDR8 = 774,\n  MONEY = 790,\n  MACADDR = 829,\n  INET = 869,\n  ACLITEM = 1033,\n  BPCHAR = 1042,\n  VARCHAR = 1043,\n  DATE = 1082,\n  TIME = 1083,\n  TIMESTAMP = 1114,\n  TIMESTAMPTZ = 1184,\n  INTERVAL = 1186,\n  TIMETZ = 1266,\n  BIT = 1560,\n  VARBIT = 1562,\n  NUMERIC = 1700,\n  REFCURSOR = 1790,\n  REGPROCEDURE = 2202,\n  REGOPER = 2203,\n  REGOPERATOR = 2204,\n  REGCLASS = 2205,\n  REGTYPE = 2206,\n  UUID = 2950,\n  TXID_SNAPSHOT = 2970,\n  PG_LSN = 3220,\n  PG_NDISTINCT = 3361,\n  PG_DEPENDENCIES = 3402,\n  TSVECTOR = 3614,\n  TSQUERY = 3615,\n  GTSVECTOR = 3642,\n  REGCONFIG = 3734,\n  REGDICTIONARY = 3769,\n  JSONB = 3802,\n  REGNAMESPACE = 4089,\n  REGROLE = 4096\n\nexport const types = {\n  string: {\n    to: TEXT,\n    from: [TEXT, VARCHAR, BPCHAR],\n    serialize: (x: string | number | Date) => {\n      if (x instanceof Date) return x.toISOString()\n      return x.toString()\n    },\n    parse: (x: string) => x,\n  },\n  number: {\n    to: 0,\n    from: [INT2, INT4, OID, FLOAT4, FLOAT8],\n    serialize: (x: number) => x.toString(),\n    parse: (x: string) => +x,\n  },\n  bigint: {\n    to: INT8,\n    from: [INT8],\n    serialize: (x: bigint) => x.toString(),\n    parse: (x: string) => {\n      const n = BigInt(x)\n      if (n < Number.MIN_SAFE_INTEGER || n > Number.MAX_SAFE_INTEGER) {\n        return n // return BigInt\n      } else {\n        return Number(n) // in range of standard JS numbers so return number\n      }\n    },\n  },\n  json: {\n    to: JSON,\n    from: [JSON, JSONB],\n    serialize: (x: any) => {\n      if (typeof x === 'string') {\n        return x\n      } else {\n        return JSON_stringify(x, (_, value) =>\n          typeof value === 'bigint' ? value.toString() : value,\n        )\n      }\n    },\n    parse: (x: string) => JSON_parse(x),\n  },\n  boolean: {\n    to: BOOL,\n    from: [BOOL],\n    // Mirror PostgreSQL's own boolean input (`boolin`): accept the same true/false\n    // literals Postgres accepts, plus the JS shapes drivers actually send for a\n    // boolean column. TypeORM's Postgres driver serializes booleans to the numbers\n    // 1/0 (see #791), and node-postgres-style params arrive as the strings\n    // 'true'/'false'. Anything Postgres itself would reject (e.g. the number 2, or\n    // 'ture') throws rather than silently coercing to 'f', matching Postgres'\n    // `invalid input syntax for type boolean` instead of corrupting the value.\n    serialize: (x: boolean | number | string) => {\n      if (typeof x === 'boolean') {\n        return x ? 't' : 'f'\n      } else if (typeof x === 'number') {\n        if (x === 1) return 't'\n        if (x === 0) return 'f'\n      } else if (typeof x === 'string') {\n        const s = x.trim().toLowerCase()\n        if (['true', 't', 'yes', 'y', 'on', '1'].includes(s)) return 't'\n        if (['false', 'f', 'no', 'n', 'off', '0'].includes(s)) return 'f'\n      }\n      throw new Error('Invalid input for boolean type')\n    },\n    parse: (x: string) => x === 't',\n  },\n  date: {\n    to: TIMESTAMPTZ,\n    from: [DATE, TIMESTAMP, TIMESTAMPTZ],\n    serialize: (x: Date | string | number) => {\n      if (typeof x === 'string') {\n        return x\n      } else if (typeof x === 'number') {\n        return new Date(x).toISOString()\n      } else if (x instanceof Date) {\n        return x.toISOString()\n      } else {\n        throw new Error('Invalid input for date type')\n      }\n    },\n    parse: (x: string | number) => new Date(x),\n  },\n  bytea: {\n    to: BYTEA,\n    from: [BYTEA],\n    serialize: (x: Uint8Array) => {\n      if (!(x instanceof Uint8Array)) {\n        throw new Error('Invalid input for bytea type')\n      }\n      return (\n        '\\\\x' +\n        Array.from(x)\n          .map((byte) => byte.toString(16).padStart(2, '0'))\n          .join('')\n      )\n    },\n    parse: (x: string): Uint8Array => {\n      const hexString = x.slice(2)\n      return Uint8Array.from({ length: hexString.length / 2 }, (_, idx) =>\n        parseInt(hexString.substring(idx * 2, (idx + 1) * 2), 16),\n      )\n    },\n  },\n} satisfies TypeHandlers\n\nexport type Parser = (x: string, typeId?: number) => any\nexport type Serializer = (x: any) => string\n\nexport type TypeHandler = {\n  to: number\n  from: number | number[]\n  serialize: Serializer\n  parse: Parser\n}\n\nexport type TypeHandlers = {\n  [key: string]: TypeHandler\n}\n\nconst defaultHandlers = typeHandlers(types)\n\nexport const parsers = defaultHandlers.parsers\nexport const serializers = defaultHandlers.serializers\n\nexport function parseType(\n  x: string | null,\n  type: number,\n  parsers?: ParserOptions,\n): any {\n  if (x === null) {\n    return null\n  }\n  const handler = parsers?.[type] ?? defaultHandlers.parsers[type]\n  if (handler) {\n    return handler(x, type)\n  } else {\n    return x\n  }\n}\n\nfunction typeHandlers(types: TypeHandlers) {\n  return Object.keys(types).reduce(\n    ({ parsers, serializers }, k) => {\n      const { to, from, serialize, parse } = types[k]\n      serializers[to] = serialize\n      serializers[k] = serialize\n      parsers[k] = parse\n      if (Array.isArray(from)) {\n        from.forEach((f) => {\n          parsers[f] = parse\n          serializers[f] = serialize\n        })\n      } else {\n        parsers[from] = parse\n        serializers[from] = serialize\n      }\n      return { parsers, serializers }\n    },\n    {\n      parsers: {} as {\n        [key: number | string]: (x: string, typeId?: number) => any\n      },\n      serializers: {} as {\n        [key: number | string]: Serializer\n      },\n    },\n  )\n}\n\nconst escapeBackslash = /\\\\/g\nconst escapeQuote = /\"/g\n\nfunction arrayEscape(x: string) {\n  return x.replace(escapeBackslash, '\\\\\\\\').replace(escapeQuote, '\\\\\"')\n}\n\nexport function arraySerializer(\n  xs: any,\n  serializer: Serializer | undefined,\n  typarray: number,\n): string {\n  if (Array.isArray(xs) === false) return xs\n\n  if (!xs.length) return '{}'\n\n  const first = xs[0]\n  // Only _box (1020) has the ';' delimiter for arrays, all other types use the ',' delimiter\n  const delimiter = typarray === 1020 ? ';' : ','\n\n  if (Array.isArray(first)) {\n    return `{${xs.map((x) => arraySerializer(x, serializer, typarray)).join(delimiter)}}`\n  } else {\n    return `{${xs\n      .map((x) => {\n        if (x === undefined) {\n          x = null\n          // TODO: Add an option to specify how to handle undefined values\n        }\n        return x === null\n          ? 'null'\n          : '\"' + arrayEscape(serializer ? serializer(x) : x.toString()) + '\"'\n      })\n      .join(delimiter)}}`\n  }\n}\n\nconst arrayParserState = {\n  i: 0,\n  char: null as string | null,\n  str: '',\n  quoted: false,\n  last: 0,\n  p: null as string | null,\n}\n\nexport function arrayParser(x: string, parser: Parser, typarray: number) {\n  arrayParserState.i = arrayParserState.last = 0\n  return arrayParserLoop(arrayParserState, x, parser, typarray)[0]\n}\n\nfunction arrayParserLoop(\n  s: typeof arrayParserState,\n  x: string,\n  parser: Parser | undefined,\n  typarray: number,\n): any[] {\n  const xs = []\n  // Only _box (1020) has the ';' delimiter for arrays, all other types use the ',' delimiter\n  const delimiter = typarray === 1020 ? ';' : ','\n  for (; s.i < x.length; s.i++) {\n    s.char = x[s.i]\n    if (s.quoted) {\n      if (s.char === '\\\\') {\n        s.str += x[++s.i]\n      } else if (s.char === '\"') {\n        xs.push(parser ? parser(s.str) : s.str)\n        s.str = ''\n        s.quoted = x[s.i + 1] === '\"'\n        s.last = s.i + 2\n      } else {\n        s.str += s.char\n      }\n    } else if (s.char === '\"') {\n      s.quoted = true\n    } else if (s.char === '{') {\n      s.last = ++s.i\n      xs.push(arrayParserLoop(s, x, parser, typarray))\n    } else if (s.char === '}') {\n      if (s.last < s.i) {\n        const el = x.slice(s.last, s.i)\n        if (el === 'NULL' && !s.quoted) {\n          xs.push(null)\n        } else {\n          xs.push(parser ? parser(el) : el)\n        }\n      }\n      s.quoted = false\n      s.last = s.i + 1\n      break\n    } else if (s.char === delimiter && s.p !== '}' && s.p !== '\"') {\n      const el = x.slice(s.last, s.i)\n      if (el === 'NULL' && !s.quoted) {\n        xs.push(null)\n      } else {\n        xs.push(parser ? parser(el) : el)\n      }\n      s.last = s.i + 1\n    }\n    s.p = s.char\n  }\n  s.last < s.i &&\n    xs.push(\n      parser ? parser(x.slice(s.last, s.i + 1)) : x.slice(s.last, s.i + 1),\n    )\n  return xs\n}\n","import {\n  BackendMessage,\n  RowDescriptionMessage,\n  DataRowMessage,\n  CommandCompleteMessage,\n  ParameterDescriptionMessage,\n} from '@electric-sql/pg-protocol/messages'\nimport type { Results, QueryOptions } from './interface.js'\nimport { parseType, type Parser } from './types.js'\n\n/**\n * This function is used to parse the results of either a simple or extended query.\n * https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-SIMPLE-QUERY\n */\nexport function parseResults(\n  messages: Array<BackendMessage>,\n  defaultParsers: Record<number | string, Parser>,\n  options?: QueryOptions,\n  blob?: Blob,\n): Array<Results> {\n  const resultSets: Results[] = []\n  let currentResultSet: Results = { rows: [], fields: [] }\n  let affectedRows = 0\n  const parsers = { ...defaultParsers, ...options?.parsers }\n\n  messages.forEach((message) => {\n    switch (message.name) {\n      case 'rowDescription': {\n        const msg = message as RowDescriptionMessage\n        currentResultSet.fields = msg.fields.map((field) => ({\n          name: field.name,\n          dataTypeID: field.dataTypeID,\n        }))\n        break\n      }\n      case 'dataRow': {\n        if (!currentResultSet) break\n        const msg = message as DataRowMessage\n        if (options?.rowMode === 'array') {\n          currentResultSet.rows.push(\n            msg.fields.map((field, i) =>\n              parseType(field, currentResultSet!.fields[i].dataTypeID, parsers),\n            ),\n          )\n        } else {\n          // rowMode === \"object\"\n          currentResultSet.rows.push(\n            Object.fromEntries(\n              msg.fields.map((field, i) => [\n                currentResultSet!.fields[i].name,\n                parseType(\n                  field,\n                  currentResultSet!.fields[i].dataTypeID,\n                  parsers,\n                ),\n              ]),\n            ),\n          )\n        }\n        break\n      }\n      case 'commandComplete': {\n        const msg = message as CommandCompleteMessage\n\n        // A command tag that carries a row count ends in it (\"SELECT 2\",\n        // \"UPDATE 3\", \"INSERT 0 5\"); all other tags end in a word\n        // (\"CREATE TABLE\").\n        const parts = msg.text.split(' ')\n        const command = parts[0]\n        const rowCount = parseInt(parts[parts.length - 1], 10)\n\n        switch (command) {\n          case 'INSERT':\n          case 'UPDATE':\n          case 'DELETE':\n          case 'COPY':\n          case 'MERGE':\n            affectedRows += rowCount\n            break\n        }\n\n        const result = {\n          ...currentResultSet,\n          command,\n          affectedRows,\n        }\n\n        if (!Number.isNaN(rowCount)) {\n          result.rowCount = rowCount\n        }\n\n        if (blob) {\n          result.blob = blob\n        }\n\n        resultSets.push(result)\n\n        currentResultSet = { rows: [], fields: [] }\n        break\n      }\n    }\n  })\n\n  if (resultSets.length === 0) {\n    resultSets.push({\n      affectedRows: 0,\n      rows: [],\n      fields: [],\n    })\n  }\n\n  return resultSets\n}\n\n/** Get the dataTypeIDs from a list of messages, if it's available. */\nexport function parseDescribeStatementResults(\n  messages: Array<BackendMessage>,\n): number[] {\n  const message = messages.find(\n    (msg): msg is ParameterDescriptionMessage =>\n      msg.name === 'parameterDescription',\n  )\n\n  if (message) {\n    return message.dataTypeIDs\n  }\n\n  return []\n}\n","import { Mode } from './types'\n\nexport type MessageName =\n  | 'parseComplete'\n  | 'bindComplete'\n  | 'closeComplete'\n  | 'noData'\n  | 'portalSuspended'\n  | 'replicationStart'\n  | 'emptyQuery'\n  | 'copyDone'\n  | 'copyData'\n  | 'rowDescription'\n  | 'parameterDescription'\n  | 'parameterStatus'\n  | 'backendKeyData'\n  | 'notification'\n  | 'readyForQuery'\n  | 'commandComplete'\n  | 'dataRow'\n  | 'copyInResponse'\n  | 'copyOutResponse'\n  | 'authenticationOk'\n  | 'authenticationMD5Password'\n  | 'authenticationCleartextPassword'\n  | 'authenticationSASL'\n  | 'authenticationSASLContinue'\n  | 'authenticationSASLFinal'\n  | 'error'\n  | 'notice'\n\nexport type BackendMessage = {\n  name: MessageName\n  length: number\n}\n\nexport const parseComplete: BackendMessage = {\n  name: 'parseComplete',\n  length: 5,\n}\n\nexport const bindComplete: BackendMessage = {\n  name: 'bindComplete',\n  length: 5,\n}\n\nexport const closeComplete: BackendMessage = {\n  name: 'closeComplete',\n  length: 5,\n}\n\nexport const noData: BackendMessage = {\n  name: 'noData',\n  length: 5,\n}\n\nexport const portalSuspended: BackendMessage = {\n  name: 'portalSuspended',\n  length: 5,\n}\n\nexport const replicationStart: BackendMessage = {\n  name: 'replicationStart',\n  length: 4,\n}\n\nexport const emptyQuery: BackendMessage = {\n  name: 'emptyQuery',\n  length: 4,\n}\n\nexport const copyDone: BackendMessage = {\n  name: 'copyDone',\n  length: 4,\n}\n\nexport class AuthenticationOk implements BackendMessage {\n  public readonly name = 'authenticationOk'\n  constructor(public readonly length: number) {}\n}\n\nexport class AuthenticationCleartextPassword implements BackendMessage {\n  public readonly name = 'authenticationCleartextPassword'\n  constructor(public readonly length: number) {}\n}\n\nexport class AuthenticationMD5Password implements BackendMessage {\n  public readonly name = 'authenticationMD5Password'\n  constructor(\n    public readonly length: number,\n    public readonly salt: Uint8Array,\n  ) {}\n}\n\nexport class AuthenticationSASL implements BackendMessage {\n  public readonly name = 'authenticationSASL'\n  constructor(\n    public readonly length: number,\n    public readonly mechanisms: string[],\n  ) {}\n}\n\nexport class AuthenticationSASLContinue implements BackendMessage {\n  public readonly name = 'authenticationSASLContinue'\n  constructor(\n    public readonly length: number,\n    public readonly data: string,\n  ) {}\n}\n\nexport class AuthenticationSASLFinal implements BackendMessage {\n  public readonly name = 'authenticationSASLFinal'\n  constructor(\n    public readonly length: number,\n    public readonly data: string,\n  ) {}\n}\n\nexport type AuthenticationMessage =\n  | AuthenticationOk\n  | AuthenticationCleartextPassword\n  | AuthenticationMD5Password\n  | AuthenticationSASL\n  | AuthenticationSASLContinue\n  | AuthenticationSASLFinal\n\ninterface NoticeOrError {\n  message: string | undefined\n  severity: string | undefined\n  code: string | undefined\n  detail: string | undefined\n  hint: string | undefined\n  position: string | undefined\n  internalPosition: string | undefined\n  internalQuery: string | undefined\n  where: string | undefined\n  schema: string | undefined\n  table: string | undefined\n  column: string | undefined\n  dataType: string | undefined\n  constraint: string | undefined\n  file: string | undefined\n  line: string | undefined\n  routine: string | undefined\n}\n\nexport class DatabaseError extends Error implements NoticeOrError {\n  public severity: string | undefined\n  public code: string | undefined\n  public detail: string | undefined\n  public hint: string | undefined\n  public position: string | undefined\n  public internalPosition: string | undefined\n  public internalQuery: string | undefined\n  public where: string | undefined\n  public schema: string | undefined\n  public table: string | undefined\n  public column: string | undefined\n  public dataType: string | undefined\n  public constraint: string | undefined\n  public file: string | undefined\n  public line: string | undefined\n  public routine: string | undefined\n  constructor(\n    message: string,\n    public readonly length: number,\n    public readonly name: MessageName,\n  ) {\n    super(message)\n  }\n}\n\nexport class CopyDataMessage implements BackendMessage {\n  public readonly name = 'copyData'\n  constructor(\n    public readonly length: number,\n    public readonly chunk: Uint8Array,\n  ) {}\n}\n\nexport class CopyResponse implements BackendMessage {\n  public readonly columnTypes: number[]\n  constructor(\n    public readonly length: number,\n    public readonly name: MessageName,\n    public readonly binary: boolean,\n    columnCount: number,\n  ) {\n    this.columnTypes = new Array(columnCount)\n  }\n}\n\nexport class Field {\n  constructor(\n    public readonly name: string,\n    public readonly tableID: number,\n    public readonly columnID: number,\n    public readonly dataTypeID: number,\n    public readonly dataTypeSize: number,\n    public readonly dataTypeModifier: number,\n    public readonly format: Mode,\n  ) {}\n}\n\nexport class RowDescriptionMessage implements BackendMessage {\n  public readonly name: MessageName = 'rowDescription'\n  public readonly fields: Field[]\n  constructor(\n    public readonly length: number,\n    public readonly fieldCount: number,\n  ) {\n    this.fields = new Array(this.fieldCount)\n  }\n}\n\nexport class ParameterDescriptionMessage implements BackendMessage {\n  public readonly name: MessageName = 'parameterDescription'\n  public readonly dataTypeIDs: number[]\n  constructor(\n    public readonly length: number,\n    public readonly parameterCount: number,\n  ) {\n    this.dataTypeIDs = new Array(this.parameterCount)\n  }\n}\n\nexport class ParameterStatusMessage implements BackendMessage {\n  public readonly name: MessageName = 'parameterStatus'\n  constructor(\n    public readonly length: number,\n    public readonly parameterName: string,\n    public readonly parameterValue: string,\n  ) {}\n}\n\nexport class BackendKeyDataMessage implements BackendMessage {\n  public readonly name: MessageName = 'backendKeyData'\n  constructor(\n    public readonly length: number,\n    public readonly processID: number,\n    public readonly secretKey: number,\n  ) {}\n}\n\nexport class NotificationResponseMessage implements BackendMessage {\n  public readonly name: MessageName = 'notification'\n  constructor(\n    public readonly length: number,\n    public readonly processId: number,\n    public readonly channel: string,\n    public readonly payload: string,\n  ) {}\n}\n\nexport class ReadyForQueryMessage implements BackendMessage {\n  public readonly name: MessageName = 'readyForQuery'\n  constructor(\n    public readonly length: number,\n    public readonly status: string,\n  ) {}\n}\n\nexport class CommandCompleteMessage implements BackendMessage {\n  public readonly name: MessageName = 'commandComplete'\n  constructor(\n    public readonly length: number,\n    public readonly text: string,\n  ) {}\n}\n\nexport class DataRowMessage implements BackendMessage {\n  public readonly fieldCount: number\n  public readonly name: MessageName = 'dataRow'\n  constructor(\n    public length: number,\n    public fields: (string | null)[],\n  ) {\n    this.fieldCount = fields.length\n  }\n}\n\nexport class NoticeMessage implements BackendMessage, NoticeOrError {\n  constructor(\n    public readonly length: number,\n    public readonly message: string | undefined,\n  ) {}\n  public readonly name = 'notice'\n  public severity: string | undefined\n  public code: string | undefined\n  public detail: string | undefined\n  public hint: string | undefined\n  public position: string | undefined\n  public internalPosition: string | undefined\n  public internalQuery: string | undefined\n  public where: string | undefined\n  public schema: string | undefined\n  public table: string | undefined\n  public column: string | undefined\n  public dataType: string | undefined\n  public constraint: string | undefined\n  public file: string | undefined\n  public line: string | undefined\n  public routine: string | undefined\n}\n","export { serialize } from './serializer'\nexport { Parser } from './parser'\nexport * as messages from './messages'\n","import { Writer } from './buffer-writer'\nimport { byteLengthUtf8 } from './string-utils'\n\nconst enum code {\n  startup = 0x70,\n  query = 0x51,\n  parse = 0x50,\n  bind = 0x42,\n  execute = 0x45,\n  flush = 0x48,\n  sync = 0x53,\n  end = 0x58,\n  close = 0x43,\n  describe = 0x44,\n  copyFromChunk = 0x64,\n  copyDone = 0x63,\n  copyFail = 0x66,\n}\n\ntype LegalValue = string | ArrayBuffer | ArrayBufferView | null\n\nconst writer = new Writer()\n\nconst startup = (opts: Record<string, string>): Uint8Array => {\n  // protocol version\n  writer.addInt16(3).addInt16(0)\n  for (const key of Object.keys(opts)) {\n    writer.addCString(key).addCString(opts[key])\n  }\n\n  writer.addCString('client_encoding').addCString('UTF8')\n\n  const bodyBuffer = writer.addCString('').flush()\n  // this message is sent without a code\n\n  const length = bodyBuffer.byteLength + 4\n\n  return new Writer().addInt32(length).add(bodyBuffer).flush()\n}\n\nconst requestSsl = (): Uint8Array => {\n  const bufferView = new DataView(new ArrayBuffer(8))\n  bufferView.setInt32(0, 8, false)\n  bufferView.setInt32(4, 80877103, false)\n  return new Uint8Array(bufferView.buffer)\n}\n\nconst password = (password: string): Uint8Array => {\n  return writer.addCString(password).flush(code.startup)\n}\n\nconst sendSASLInitialResponseMessage = (\n  mechanism: string,\n  initialResponse: string,\n): Uint8Array => {\n  // 0x70 = 'p'\n  writer\n    .addCString(mechanism)\n    .addInt32(byteLengthUtf8(initialResponse))\n    .addString(initialResponse)\n\n  return writer.flush(code.startup)\n}\n\nconst sendSCRAMClientFinalMessage = (additionalData: string): Uint8Array => {\n  return writer.addString(additionalData).flush(code.startup)\n}\n\nconst query = (text: string): Uint8Array => {\n  return writer.addCString(text).flush(code.query)\n}\n\ntype ParseOpts = {\n  name?: string\n  types?: number[]\n  text: string\n}\n\nconst emptyValueArray: LegalValue[] = []\n\nconst parse = (query: ParseOpts): Uint8Array => {\n  // expect something like this:\n  // { name: 'queryName',\n  //   text: 'select * from blah',\n  //   types: ['int8', 'bool'] }\n\n  // normalize missing query names to allow for null\n  const name = query.name ?? ''\n  if (name.length > 63) {\n    /* eslint-disable no-console */\n    console.error(\n      'Warning! Postgres only supports 63 characters for query names.',\n    )\n    console.error('You supplied %s (%s)', name, name.length)\n    console.error(\n      'This can cause conflicts and silent errors executing queries',\n    )\n    /* eslint-enable no-console */\n  }\n\n  const buffer = writer\n    .addCString(name) // name of query\n    .addCString(query.text) // actual query text\n    .addInt16(query.types?.length ?? 0)\n\n  query.types?.forEach((type) => buffer.addInt32(type))\n\n  return writer.flush(code.parse)\n}\n\ntype ValueMapper = (param: unknown, index: number) => LegalValue\n\ntype BindOpts = {\n  portal?: string\n  binary?: boolean\n  statement?: string\n  values?: LegalValue[]\n  // optional map from JS value to postgres value per parameter\n  valueMapper?: ValueMapper\n}\n\nconst paramWriter = new Writer()\n\n// make this a const enum so typescript will inline the value\nconst enum ParamType {\n  STRING = 0,\n  BINARY = 1,\n}\n\nconst writeValues = (values: LegalValue[], valueMapper?: ValueMapper): void => {\n  for (let i = 0; i < values.length; i++) {\n    const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i]\n    if (mappedVal === null) {\n      // add the param type (string) to the writer\n      writer.addInt16(ParamType.STRING)\n      // write -1 to the param writer to indicate null\n      paramWriter.addInt32(-1)\n    } else if (\n      mappedVal instanceof ArrayBuffer ||\n      ArrayBuffer.isView(mappedVal)\n    ) {\n      const buffer = ArrayBuffer.isView(mappedVal)\n        ? mappedVal.buffer.slice(\n            mappedVal.byteOffset,\n            mappedVal.byteOffset + mappedVal.byteLength,\n          )\n        : mappedVal\n      // add the param type (binary) to the writer\n      writer.addInt16(ParamType.BINARY)\n      // add the buffer to the param writer\n      paramWriter.addInt32(buffer.byteLength)\n      paramWriter.add(buffer)\n    } else {\n      // add the param type (string) to the writer\n      writer.addInt16(ParamType.STRING)\n      paramWriter.addInt32(byteLengthUtf8(mappedVal))\n      paramWriter.addString(mappedVal)\n    }\n  }\n}\n\nconst bind = (config: BindOpts = {}): Uint8Array => {\n  // normalize config\n  const portal = config.portal ?? ''\n  const statement = config.statement ?? ''\n  const binary = config.binary ?? false\n  const values = config.values ?? emptyValueArray\n  const len = values.length\n\n  writer.addCString(portal).addCString(statement)\n  writer.addInt16(len)\n\n  writeValues(values, config.valueMapper)\n\n  writer.addInt16(len)\n  writer.add(paramWriter.flush())\n\n  // format code\n  writer.addInt16(binary ? ParamType.BINARY : ParamType.STRING)\n  return writer.flush(code.bind)\n}\n\ntype ExecOpts = {\n  portal?: string\n  rows?: number\n}\n\nconst emptyExecute = new Uint8Array([\n  code.execute,\n  0x00,\n  0x00,\n  0x00,\n  0x09,\n  0x00,\n  0x00,\n  0x00,\n  0x00,\n  0x00,\n])\n\nconst execute = (config?: ExecOpts): Uint8Array => {\n  // this is the happy path for most queries\n  if (!config || (!config.portal && !config.rows)) {\n    return emptyExecute\n  }\n\n  const portal = config.portal ?? ''\n  const rows = config.rows ?? 0\n\n  const portalLength = byteLengthUtf8(portal)\n  const len = 4 + portalLength + 1 + 4\n  // one extra bit for code\n  const bufferView = new DataView(new ArrayBuffer(1 + len))\n  bufferView.setUint8(0, code.execute)\n  bufferView.setInt32(1, len, false)\n  new TextEncoder().encodeInto(portal, new Uint8Array(bufferView.buffer, 5))\n  bufferView.setUint8(portalLength + 5, 0) // null terminate portal cString\n  bufferView.setUint32(bufferView.byteLength - 4, rows, false)\n  return new Uint8Array(bufferView.buffer)\n}\n\nconst cancel = (processID: number, secretKey: number): Uint8Array => {\n  const bufferView = new DataView(new ArrayBuffer(16))\n  bufferView.setInt32(0, 16, false)\n  bufferView.setInt16(4, 1234, false)\n  bufferView.setInt16(6, 5678, false)\n  bufferView.setInt32(8, processID, false)\n  bufferView.setInt32(12, secretKey, false)\n  return new Uint8Array(bufferView.buffer)\n}\n\ntype PortalOpts = {\n  type: 'S' | 'P'\n  name?: string\n}\n\nconst cstringMessage = (code: code, string: string): Uint8Array => {\n  const writer = new Writer()\n  writer.addCString(string)\n  return writer.flush(code)\n}\n\nconst emptyDescribePortal = writer.addCString('P').flush(code.describe)\nconst emptyDescribeStatement = writer.addCString('S').flush(code.describe)\n\nconst describe = (msg: PortalOpts): Uint8Array => {\n  return msg.name\n    ? cstringMessage(code.describe, `${msg.type}${msg.name ?? ''}`)\n    : msg.type === 'P'\n      ? emptyDescribePortal\n      : emptyDescribeStatement\n}\n\nconst close = (msg: PortalOpts): Uint8Array => {\n  const text = `${msg.type}${msg.name ?? ''}`\n  return cstringMessage(code.close, text)\n}\n\nconst copyData = (chunk: ArrayBuffer): Uint8Array => {\n  return writer.add(chunk).flush(code.copyFromChunk)\n}\n\nconst copyFail = (message: string): Uint8Array => {\n  return cstringMessage(code.copyFail, message)\n}\n\nconst codeOnlyBuffer = (code: code): Uint8Array =>\n  new Uint8Array([code, 0x00, 0x00, 0x00, 0x04])\n\nconst flushBuffer = codeOnlyBuffer(code.flush)\nconst syncBuffer = codeOnlyBuffer(code.sync)\nconst endBuffer = codeOnlyBuffer(code.end)\nconst copyDoneBuffer = codeOnlyBuffer(code.copyDone)\n\nconst serialize = {\n  startup,\n  password,\n  requestSsl,\n  sendSASLInitialResponseMessage,\n  sendSCRAMClientFinalMessage,\n  query,\n  parse,\n  bind,\n  execute,\n  describe,\n  close,\n  flush: () => flushBuffer,\n  sync: () => syncBuffer,\n  end: () => endBuffer,\n  copyData,\n  copyDone: () => copyDoneBuffer,\n  copyFail,\n  cancel,\n}\n\nexport { serialize }\n","import { byteLengthUtf8 } from './string-utils'\n\nexport class Writer {\n  #bufferView: DataView\n  #offset: number = 5\n\n  readonly #littleEndian = false as const\n  readonly #encoder = new TextEncoder()\n  readonly #headerPosition: number = 0\n  constructor(private size = 256) {\n    this.#bufferView = this.#allocateBuffer(size)\n  }\n\n  #allocateBuffer(size: number): DataView {\n    return new DataView(new ArrayBuffer(size))\n  }\n\n  #ensure(size: number): void {\n    const remaining = this.#bufferView.byteLength - this.#offset\n    if (remaining < size) {\n      const oldBuffer = this.#bufferView.buffer\n      // exponential growth factor of around ~ 1.5\n      // https://stackoverflow.com/questions/2269063/buffer-growth-strategy\n      const newSize = oldBuffer.byteLength + (oldBuffer.byteLength >> 1) + size\n      this.#bufferView = this.#allocateBuffer(newSize)\n      new Uint8Array(this.#bufferView.buffer).set(new Uint8Array(oldBuffer))\n    }\n  }\n\n  public addInt32(num: number): Writer {\n    this.#ensure(4)\n    this.#bufferView.setInt32(this.#offset, num, this.#littleEndian)\n    this.#offset += 4\n    return this\n  }\n\n  public addInt16(num: number): Writer {\n    this.#ensure(2)\n    this.#bufferView.setInt16(this.#offset, num, this.#littleEndian)\n    this.#offset += 2\n    return this\n  }\n\n  public addCString(string: string): Writer {\n    if (string) {\n      // TODO(msfstef): might be faster to extract `addString` code and\n      // ensure length + 1 once rather than length and then +1?\n      this.addString(string)\n    }\n\n    // set null terminator\n    this.#ensure(1)\n    this.#bufferView.setUint8(this.#offset, 0)\n    this.#offset++\n    return this\n  }\n\n  public addString(string: string = ''): Writer {\n    const length = byteLengthUtf8(string)\n    this.#ensure(length)\n    this.#encoder.encodeInto(\n      string,\n      new Uint8Array(this.#bufferView.buffer, this.#offset),\n    )\n    this.#offset += length\n    return this\n  }\n\n  public add(otherBuffer: ArrayBuffer): Writer {\n    this.#ensure(otherBuffer.byteLength)\n    new Uint8Array(this.#bufferView.buffer).set(\n      new Uint8Array(otherBuffer),\n      this.#offset,\n    )\n\n    this.#offset += otherBuffer.byteLength\n    return this\n  }\n\n  #join(code?: number): ArrayBuffer {\n    if (code) {\n      this.#bufferView.setUint8(this.#headerPosition, code)\n      // length is everything in this packet minus the code\n      const length = this.#offset - (this.#headerPosition + 1)\n      this.#bufferView.setInt32(\n        this.#headerPosition + 1,\n        length,\n        this.#littleEndian,\n      )\n    }\n    return this.#bufferView.buffer.slice(code ? 0 : 5, this.#offset)\n  }\n\n  public flush(code?: number): Uint8Array {\n    const result = this.#join(code)\n    this.#offset = 5\n    this.#bufferView = this.#allocateBuffer(this.size)\n    return new Uint8Array(result)\n  }\n}\n","/**\n * Calculates the byte length of a UTF-8 encoded string\n * Adapted from https://stackoverflow.com/a/23329386\n * @param str - UTF-8 encoded string\n * @returns byte length of string\n */\nfunction byteLengthUtf8(str: string): number {\n  let byteLength = str.length\n  for (let i = str.length - 1; i >= 0; i--) {\n    const code = str.charCodeAt(i)\n    if (code > 0x7f && code <= 0x7ff) byteLength++\n    else if (code > 0x7ff && code <= 0xffff) byteLength += 2\n    if (code >= 0xdc00 && code <= 0xdfff) i-- // trail surrogate\n  }\n  return byteLength\n}\n\nexport { byteLengthUtf8 }\n","import {\n  bindComplete,\n  parseComplete,\n  closeComplete,\n  noData,\n  portalSuspended,\n  copyDone,\n  replicationStart,\n  emptyQuery,\n  ReadyForQueryMessage,\n  CommandCompleteMessage,\n  CopyDataMessage,\n  CopyResponse,\n  NotificationResponseMessage,\n  RowDescriptionMessage,\n  ParameterDescriptionMessage,\n  Field,\n  DataRowMessage,\n  ParameterStatusMessage,\n  BackendKeyDataMessage,\n  DatabaseError,\n  BackendMessage,\n  MessageName,\n  NoticeMessage,\n  AuthenticationMessage,\n  AuthenticationOk,\n  AuthenticationCleartextPassword,\n  AuthenticationMD5Password,\n  AuthenticationSASL,\n  AuthenticationSASLContinue,\n  AuthenticationSASLFinal,\n} from './messages'\nimport { BufferParameter, Modes } from './types'\nimport { BufferReader } from './buffer-reader'\n\n// every message is prefixed with a single bye\nconst CODE_LENGTH = 1 as const\n// every message has an int32 length which includes itself but does\n// NOT include the code in the length\nconst LEN_LENGTH = 4 as const\n\nconst HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH\n\nexport type Packet = {\n  code: number\n  packet: ArrayBuffer\n}\n\nconst emptyBuffer = new ArrayBuffer(0)\n\nconst enum MessageCodes {\n  DataRow = 0x44, // D\n  ParseComplete = 0x31, // 1\n  BindComplete = 0x32, // 2\n  CloseComplete = 0x33, // 3\n  CommandComplete = 0x43, // C\n  ReadyForQuery = 0x5a, // Z\n  NoData = 0x6e, // n\n  NotificationResponse = 0x41, // A\n  AuthenticationResponse = 0x52, // R\n  ParameterStatus = 0x53, // S\n  BackendKeyData = 0x4b, // K\n  ErrorMessage = 0x45, // E\n  NoticeMessage = 0x4e, // N\n  RowDescriptionMessage = 0x54, // T\n  ParameterDescriptionMessage = 0x74, // t\n  PortalSuspended = 0x73, // s\n  ReplicationStart = 0x57, // W\n  EmptyQuery = 0x49, // I\n  CopyIn = 0x47, // G\n  CopyOut = 0x48, // H\n  CopyDone = 0x63, // c\n  CopyData = 0x64, // d\n}\n\nexport type MessageCallback = (msg: BackendMessage) => void\n\nexport class Parser {\n  #bufferView: DataView = new DataView(emptyBuffer)\n  #bufferRemainingLength: number = 0\n  #bufferOffset: number = 0\n  #reader = new BufferReader()\n\n  public parse(buffer: BufferParameter, callback: MessageCallback) {\n    this.#mergeBuffer(\n      ArrayBuffer.isView(buffer)\n        ? buffer.buffer.slice(\n            buffer.byteOffset,\n            buffer.byteOffset + buffer.byteLength,\n          )\n        : buffer,\n    )\n    const bufferFullLength = this.#bufferOffset + this.#bufferRemainingLength\n    let offset = this.#bufferOffset\n    while (offset + HEADER_LENGTH <= bufferFullLength) {\n      // code is 1 byte long - it identifies the message type\n      const code = this.#bufferView.getUint8(offset)\n      // length is 1 Uint32BE - it is the length of the message EXCLUDING the code\n      const length = this.#bufferView.getUint32(offset + CODE_LENGTH, false)\n      const fullMessageLength = CODE_LENGTH + length\n      if (fullMessageLength + offset <= bufferFullLength && length > 0) {\n        let message: BackendMessage\n        try {\n          message = this.#handlePacket(\n            offset + HEADER_LENGTH,\n            code,\n            length,\n            this.#bufferView.buffer,\n          )\n        } catch (error) {\n          this.#resetBuffer()\n          throw error\n        }\n        callback(message)\n        offset += fullMessageLength\n      } else {\n        break\n      }\n    }\n    if (offset === bufferFullLength) {\n      // No more use for the buffer\n      this.#resetBuffer()\n    } else {\n      // Adjust the cursors of remainingBuffer\n      this.#bufferRemainingLength = bufferFullLength - offset\n      this.#bufferOffset = offset\n    }\n  }\n\n  #resetBuffer(): void {\n    this.#bufferView = new DataView(emptyBuffer)\n    this.#bufferRemainingLength = 0\n    this.#bufferOffset = 0\n  }\n\n  #mergeBuffer(buffer: ArrayBuffer): void {\n    if (this.#bufferRemainingLength > 0) {\n      const newLength = this.#bufferRemainingLength + buffer.byteLength\n      const newFullLength = newLength + this.#bufferOffset\n      if (newFullLength > this.#bufferView.byteLength) {\n        // We can't concat the new buffer with the remaining one\n        let newBuffer: ArrayBuffer\n        if (\n          newLength <= this.#bufferView.byteLength &&\n          this.#bufferOffset >= this.#bufferRemainingLength\n        ) {\n          // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer\n          newBuffer = this.#bufferView.buffer\n        } else {\n          // Allocate a new larger buffer\n          let newBufferLength = this.#bufferView.byteLength * 2\n          while (newLength >= newBufferLength) {\n            newBufferLength *= 2\n          }\n          newBuffer = new ArrayBuffer(newBufferLength)\n        }\n        // Move the remaining buffer to the new one\n        new Uint8Array(newBuffer).set(\n          new Uint8Array(\n            this.#bufferView.buffer,\n            this.#bufferOffset,\n            this.#bufferRemainingLength,\n          ),\n        )\n        this.#bufferView = new DataView(newBuffer)\n        this.#bufferOffset = 0\n      }\n\n      // Concat the new buffer with the remaining one\n      new Uint8Array(this.#bufferView.buffer).set(\n        new Uint8Array(buffer),\n        this.#bufferOffset + this.#bufferRemainingLength,\n      )\n      this.#bufferRemainingLength = newLength\n    } else {\n      this.#bufferView = new DataView(buffer)\n      this.#bufferOffset = 0\n      this.#bufferRemainingLength = buffer.byteLength\n    }\n  }\n\n  #handlePacket(\n    offset: number,\n    code: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ): BackendMessage {\n    switch (code) {\n      case MessageCodes.BindComplete:\n        return bindComplete\n      case MessageCodes.ParseComplete:\n        return parseComplete\n      case MessageCodes.CloseComplete:\n        return closeComplete\n      case MessageCodes.NoData:\n        return noData\n      case MessageCodes.PortalSuspended:\n        return portalSuspended\n      case MessageCodes.CopyDone:\n        return copyDone\n      case MessageCodes.ReplicationStart:\n        return replicationStart\n      case MessageCodes.EmptyQuery:\n        return emptyQuery\n      case MessageCodes.DataRow:\n        return this.#parseDataRowMessage(offset, length, bytes)\n      case MessageCodes.CommandComplete:\n        return this.#parseCommandCompleteMessage(offset, length, bytes)\n      case MessageCodes.ReadyForQuery:\n        return this.#parseReadyForQueryMessage(offset, length, bytes)\n      case MessageCodes.NotificationResponse:\n        return this.#parseNotificationMessage(offset, length, bytes)\n      case MessageCodes.AuthenticationResponse:\n        return this.#parseAuthenticationResponse(offset, length, bytes)\n      case MessageCodes.ParameterStatus:\n        return this.#parseParameterStatusMessage(offset, length, bytes)\n      case MessageCodes.BackendKeyData:\n        return this.#parseBackendKeyData(offset, length, bytes)\n      case MessageCodes.ErrorMessage:\n        return this.#parseErrorMessage(offset, length, bytes, 'error')\n      case MessageCodes.NoticeMessage:\n        return this.#parseErrorMessage(offset, length, bytes, 'notice')\n      case MessageCodes.RowDescriptionMessage:\n        return this.#parseRowDescriptionMessage(offset, length, bytes)\n      case MessageCodes.ParameterDescriptionMessage:\n        return this.#parseParameterDescriptionMessage(offset, length, bytes)\n      case MessageCodes.CopyIn:\n        return this.#parseCopyInMessage(offset, length, bytes)\n      case MessageCodes.CopyOut:\n        return this.#parseCopyOutMessage(offset, length, bytes)\n      case MessageCodes.CopyData:\n        return this.#parseCopyData(offset, length, bytes)\n      default:\n        return new DatabaseError(\n          'received invalid response: ' + code.toString(16),\n          length,\n          'error',\n        )\n    }\n  }\n\n  #parseReadyForQueryMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const status = this.#reader.string(1)\n    return new ReadyForQueryMessage(length, status)\n  }\n\n  #parseCommandCompleteMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const text = this.#reader.cstring()\n    return new CommandCompleteMessage(length, text)\n  }\n\n  #parseCopyData(offset: number, length: number, bytes: ArrayBuffer) {\n    const chunk = bytes.slice(offset, offset + (length - 4))\n    return new CopyDataMessage(length, new Uint8Array(chunk))\n  }\n\n  #parseCopyInMessage(offset: number, length: number, bytes: ArrayBuffer) {\n    return this.#parseCopyMessage(offset, length, bytes, 'copyInResponse')\n  }\n\n  #parseCopyOutMessage(offset: number, length: number, bytes: ArrayBuffer) {\n    return this.#parseCopyMessage(offset, length, bytes, 'copyOutResponse')\n  }\n\n  #parseCopyMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n    messageName: MessageName,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const isBinary = this.#reader.byte() !== 0\n    const columnCount = this.#reader.int16()\n    const message = new CopyResponse(length, messageName, isBinary, columnCount)\n    for (let i = 0; i < columnCount; i++) {\n      message.columnTypes[i] = this.#reader.int16()\n    }\n    return message\n  }\n\n  #parseNotificationMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const processId = this.#reader.int32()\n    const channel = this.#reader.cstring()\n    const payload = this.#reader.cstring()\n    return new NotificationResponseMessage(length, processId, channel, payload)\n  }\n\n  #parseRowDescriptionMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const fieldCount = this.#reader.int16()\n    const message = new RowDescriptionMessage(length, fieldCount)\n    for (let i = 0; i < fieldCount; i++) {\n      message.fields[i] = this.#parseField()\n    }\n    return message\n  }\n\n  #parseField(): Field {\n    const name = this.#reader.cstring()\n    const tableID = this.#reader.int32()\n    const columnID = this.#reader.int16()\n    const dataTypeID = this.#reader.int32()\n    const dataTypeSize = this.#reader.int16()\n    const dataTypeModifier = this.#reader.int32()\n    const mode = this.#reader.int16() === 0 ? Modes.text : Modes.binary\n    return new Field(\n      name,\n      tableID,\n      columnID,\n      dataTypeID,\n      dataTypeSize,\n      dataTypeModifier,\n      mode,\n    )\n  }\n\n  #parseParameterDescriptionMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const parameterCount = this.#reader.int16()\n    const message = new ParameterDescriptionMessage(length, parameterCount)\n    for (let i = 0; i < parameterCount; i++) {\n      message.dataTypeIDs[i] = this.#reader.int32()\n    }\n    return message\n  }\n\n  #parseDataRowMessage(offset: number, length: number, bytes: ArrayBuffer) {\n    this.#reader.setBuffer(offset, bytes)\n    const fieldCount = this.#reader.int16()\n    const fields: (string | null)[] = new Array(fieldCount)\n    for (let i = 0; i < fieldCount; i++) {\n      const len = this.#reader.int32()\n      // a -1 for length means the value of the field is null\n      fields[i] = len === -1 ? null : this.#reader.string(len)\n    }\n    return new DataRowMessage(length, fields)\n  }\n\n  #parseParameterStatusMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const name = this.#reader.cstring()\n    const value = this.#reader.cstring()\n    return new ParameterStatusMessage(length, name, value)\n  }\n\n  #parseBackendKeyData(offset: number, length: number, bytes: ArrayBuffer) {\n    this.#reader.setBuffer(offset, bytes)\n    const processID = this.#reader.int32()\n    const secretKey = this.#reader.int32()\n    return new BackendKeyDataMessage(length, processID, secretKey)\n  }\n\n  #parseAuthenticationResponse(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n  ): AuthenticationMessage {\n    this.#reader.setBuffer(offset, bytes)\n    const code = this.#reader.int32()\n    switch (code) {\n      case 0:\n        return new AuthenticationOk(length)\n      case 3:\n        return new AuthenticationCleartextPassword(length)\n\n      case 5:\n        return new AuthenticationMD5Password(length, this.#reader.bytes(4))\n\n      case 10: {\n        const mechanisms: string[] = []\n        while (true) {\n          const mechanism = this.#reader.cstring()\n          if (mechanism.length === 0) {\n            return new AuthenticationSASL(length, mechanisms)\n          }\n          mechanisms.push(mechanism)\n        }\n      }\n      case 11:\n        return new AuthenticationSASLContinue(\n          length,\n          this.#reader.string(length - 8),\n        )\n\n      case 12:\n        return new AuthenticationSASLFinal(\n          length,\n          this.#reader.string(length - 8),\n        )\n\n      default:\n        throw new Error('Unknown authenticationOk message type ' + code)\n    }\n  }\n\n  #parseErrorMessage(\n    offset: number,\n    length: number,\n    bytes: ArrayBuffer,\n    name: MessageName,\n  ) {\n    this.#reader.setBuffer(offset, bytes)\n    const fields: Record<string, string> = {}\n    let fieldType = this.#reader.string(1)\n    while (fieldType !== '\\0') {\n      fields[fieldType] = this.#reader.cstring()\n      fieldType = this.#reader.string(1)\n    }\n\n    const messageValue = fields.M\n\n    const message =\n      name === 'notice'\n        ? new NoticeMessage(length, messageValue)\n        : new DatabaseError(messageValue, length, name)\n\n    message.severity = fields.S\n    message.code = fields.C\n    message.detail = fields.D\n    message.hint = fields.H\n    message.position = fields.P\n    message.internalPosition = fields.p\n    message.internalQuery = fields.q\n    message.where = fields.W\n    message.schema = fields.s\n    message.table = fields.t\n    message.column = fields.c\n    message.dataType = fields.d\n    message.constraint = fields.n\n    message.file = fields.F\n    message.line = fields.L\n    message.routine = fields.R\n    return message\n  }\n}\n","export const Modes = {\n  text: 0,\n  binary: 1,\n} as const\n\nexport type Mode = (typeof Modes)[keyof typeof Modes]\n\nexport type BufferParameter = ArrayBuffer | ArrayBufferView\n","const emptyBuffer = new ArrayBuffer(0)\n\nexport class BufferReader {\n  #bufferView: DataView = new DataView(emptyBuffer)\n  #offset: number\n\n  // TODO(bmc): support non-utf8 encoding?\n  readonly #encoding: string = 'utf-8' as const\n  readonly #decoder = new TextDecoder(this.#encoding)\n  readonly #littleEndian: boolean = false as const\n\n  constructor(offset: number = 0) {\n    this.#offset = offset\n  }\n\n  public setBuffer(offset: number, buffer: ArrayBuffer): void {\n    this.#offset = offset\n    this.#bufferView = new DataView(buffer)\n  }\n\n  public int16(): number {\n    // const result = this.buffer.readInt16BE(this.#offset)\n    const result = this.#bufferView.getInt16(this.#offset, this.#littleEndian)\n    this.#offset += 2\n    return result\n  }\n\n  public byte(): number {\n    // const result = this.bufferView[this.#offset]\n    const result = this.#bufferView.getUint8(this.#offset)\n    this.#offset++\n    return result\n  }\n\n  public int32(): number {\n    // const result = this.buffer.readInt32BE(this.#offset)\n    const result = this.#bufferView.getInt32(this.#offset, this.#littleEndian)\n    this.#offset += 4\n    return result\n  }\n\n  public string(length: number): string {\n    // const result = this.#bufferView.toString(\n    //   this.#encoding,\n    //   this.#offset,\n    //   this.#offset + length,\n    // )\n    // this.#offset += length\n\n    const result = this.#decoder.decode(this.bytes(length))\n    return result\n  }\n\n  public cstring(): string {\n    // const start = this.#offset\n    // let end = start\n    // while (this.#bufferView[end++] !== 0) {}\n\n    const start = this.#offset\n    let end = start\n    while (this.#bufferView.getUint8(end++) !== 0) {\n      // no-op - increment until terminator reached\n    }\n    const result = this.string(end - start - 1)\n    this.#offset = end\n    return result\n  }\n\n  public bytes(length: number): Uint8Array {\n    // const result = this.buffer.slice(this.#offset, this.#offset + length)\n    const result = this.#bufferView.buffer.slice(\n      this.#offset,\n      this.#offset + length,\n    )\n    this.#offset += length\n    return new Uint8Array(result)\n  }\n}\n"],"mappings":"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","names":["types_exports","__export","ABSTIME","ACLITEM","BIT","BOOL","BPCHAR","BYTEA","CHAR","CID","CIDR","CIRCLE","DATE","FLOAT4","FLOAT8","GTSVECTOR","INET","INT2","INT4","INT8","INTERVAL","JSON","JSONB","MACADDR","MACADDR8","MONEY","NUMERIC","OID","PATH","PG_DEPENDENCIES","PG_LSN","PG_NDISTINCT","PG_NODE_TREE","POLYGON","REFCURSOR","REGCLASS","REGCONFIG","REGDICTIONARY","REGNAMESPACE","REGOPER","REGOPERATOR","REGPROC","REGPROCEDURE","REGROLE","REGTYPE","RELTIME","SMGR","TEXT","TID","TIME","TIMESTAMP","TIMESTAMPTZ","TIMETZ","TINTERVAL","TSQUERY","TSVECTOR","TXID_SNAPSHOT","UUID","VARBIT","VARCHAR","XID","XML","arrayParser","arraySerializer","parseType","parsers","serializers","types","init_esm_shims","JSON_parse","JSON_stringify","x","n","_","value","s","byte","hexString","idx","defaultHandlers","typeHandlers","type","handler","k","to","from","serialize","parse","f","escapeBackslash","escapeQuote","arrayEscape","xs","serializer","typarray","first","delimiter","arrayParserState","parser","arrayParserLoop","el","parse_exports","__export","parseDescribeStatementResults","parseResults","init_esm_shims","parseResults","messages","defaultParsers","options","blob","resultSets","currentResultSet","affectedRows","parsers","message","msg","field","i","parseType","parts","command","rowCount","result","parseDescribeStatementResults","messages_exports","__export","AuthenticationCleartextPassword","AuthenticationMD5Password","AuthenticationOk","AuthenticationSASL","AuthenticationSASLContinue","AuthenticationSASLFinal","BackendKeyDataMessage","CommandCompleteMessage","CopyDataMessage","CopyResponse","DataRowMessage","DatabaseError","Field","NoticeMessage","NotificationResponseMessage","ParameterDescriptionMessage","ParameterStatusMessage","ReadyForQueryMessage","RowDescriptionMessage","bindComplete","closeComplete","copyDone","emptyQuery","noData","parseComplete","portalSuspended","replicationStart","init_esm_shims","length","salt","mechanisms","data","message","name","chunk","binary","columnCount","tableID","columnID","dataTypeID","dataTypeSize","dataTypeModifier","format","fieldCount","parameterCount","parameterName","parameterValue","processID","secretKey","processId","channel","payload","status","text","fields","src_exports","__export","Parser","messages_exports","serialize","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","byteLengthUtf8","str","byteLength","i","code","_bufferView","_offset","_littleEndian","_encoder","_headerPosition","_Writer_instances","allocateBuffer_fn","ensure_fn","join_fn","Writer","size","__privateAdd","__privateSet","__privateMethod","num","__privateGet","string","__privateWrapper","length","byteLengthUtf8","otherBuffer","code","result","oldBuffer","newSize","writer","Writer","startup","opts","key","bodyBuffer","length","requestSsl","bufferView","password","sendSASLInitialResponseMessage","mechanism","initialResponse","byteLengthUtf8","sendSCRAMClientFinalMessage","additionalData","query","text","emptyValueArray","parse","name","buffer","type","paramWriter","writeValues","values","valueMapper","i","mappedVal","writer","paramWriter","buffer","byteLengthUtf8","bind","config","portal","statement","binary","emptyValueArray","len","emptyExecute","execute","rows","portalLength","bufferView","cancel","processID","secretKey","cstringMessage","code","string","Writer","emptyDescribePortal","emptyDescribeStatement","describe","msg","close","text","copyData","chunk","copyFail","message","codeOnlyBuffer","flushBuffer","syncBuffer","endBuffer","copyDoneBuffer","serialize","startup","password","requestSsl","sendSASLInitialResponseMessage","sendSCRAMClientFinalMessage","query","parse","init_esm_shims","init_esm_shims","Modes","init_esm_shims","emptyBuffer","_bufferView","_offset","_encoding","_decoder","_littleEndian","BufferReader","offset","__privateAdd","__privateGet","__privateSet","buffer","result","__privateWrapper","length","start","end","CODE_LENGTH","LEN_LENGTH","HEADER_LENGTH","emptyBuffer","_bufferView","_bufferRemainingLength","_bufferOffset","_reader","_Parser_instances","resetBuffer_fn","mergeBuffer_fn","handlePacket_fn","parseReadyForQueryMessage_fn","parseCommandCompleteMessage_fn","parseCopyData_fn","parseCopyInMessage_fn","parseCopyOutMessage_fn","parseCopyMessage_fn","parseNotificationMessage_fn","parseRowDescriptionMessage_fn","parseField_fn","parseParameterDescriptionMessage_fn","parseDataRowMessage_fn","parseParameterStatusMessage_fn","parseBackendKeyData_fn","parseAuthenticationResponse_fn","parseErrorMessage_fn","Parser","__privateAdd","emptyBuffer","BufferReader","buffer","callback","__privateMethod","bufferFullLength","__privateGet","offset","HEADER_LENGTH","code","length","CODE_LENGTH","fullMessageLength","message","error","__privateSet","newLength","newBuffer","newBufferLength","bytes","bindComplete","parseComplete","closeComplete","noData","portalSuspended","copyDone","replicationStart","emptyQuery","DatabaseError","status","ReadyForQueryMessage","text","CommandCompleteMessage","chunk","CopyDataMessage","messageName","isBinary","columnCount","CopyResponse","i","processId","channel","payload","NotificationResponseMessage","fieldCount","RowDescriptionMessage","name","tableID","columnID","dataTypeID","dataTypeSize","dataTypeModifier","mode","Modes","Field","parameterCount","ParameterDescriptionMessage","fields","len","DataRowMessage","value","ParameterStatusMessage","processID","secretKey","BackendKeyDataMessage","AuthenticationOk","AuthenticationCleartextPassword","AuthenticationMD5Password","mechanisms","mechanism","AuthenticationSASL","AuthenticationSASLContinue","AuthenticationSASLFinal","fieldType","messageValue","NoticeMessage"]}