| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.serialize = void 0;const buffer_writer_1 = require("./buffer-writer");const writer = new buffer_writer_1.Writer();const startup = (opts) => {    // protocol version    writer.addInt16(3).addInt16(0);    for (const key of Object.keys(opts)) {        writer.addCString(key).addCString(opts[key]);    }    writer.addCString('client_encoding').addCString('UTF8');    var bodyBuffer = writer.addCString('').flush();    // this message is sent without a code    var length = bodyBuffer.length + 4;    return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();};const requestSsl = () => {    const response = Buffer.allocUnsafe(8);    response.writeInt32BE(8, 0);    response.writeInt32BE(80877103, 4);    return response;};const password = (password) => {    return writer.addCString(password).flush(112 /* startup */);};const sendSASLInitialResponseMessage = function (mechanism, initialResponse) {    // 0x70 = 'p'    writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse);    return writer.flush(112 /* startup */);};const sendSCRAMClientFinalMessage = function (additionalData) {    return writer.addString(additionalData).flush(112 /* startup */);};const query = (text) => {    return writer.addCString(text).flush(81 /* query */);};const emptyArray = [];const parse = (query) => {    // expect something like this:    // { name: 'queryName',    //   text: 'select * from blah',    //   types: ['int8', 'bool'] }    // normalize missing query names to allow for null    const name = query.name || '';    if (name.length > 63) {        /* eslint-disable no-console */        console.error('Warning! Postgres only supports 63 characters for query names.');        console.error('You supplied %s (%s)', name, name.length);        console.error('This can cause conflicts and silent errors executing queries');        /* eslint-enable no-console */    }    const types = query.types || emptyArray;    var len = types.length;    var buffer = writer        .addCString(name) // name of query        .addCString(query.text) // actual query text        .addInt16(len);    for (var i = 0; i < len; i++) {        buffer.addInt32(types[i]);    }    return writer.flush(80 /* parse */);};const paramWriter = new buffer_writer_1.Writer();const writeValues = function (values, valueMapper) {    for (let i = 0; i < values.length; i++) {        const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];        if (mappedVal == null) {            // add the param type (string) to the writer            writer.addInt16(0 /* STRING */);            // write -1 to the param writer to indicate null            paramWriter.addInt32(-1);        }        else if (mappedVal instanceof Buffer) {            // add the param type (binary) to the writer            writer.addInt16(1 /* BINARY */);            // add the buffer to the param writer            paramWriter.addInt32(mappedVal.length);            paramWriter.add(mappedVal);        }        else {            // add the param type (string) to the writer            writer.addInt16(0 /* STRING */);            paramWriter.addInt32(Buffer.byteLength(mappedVal));            paramWriter.addString(mappedVal);        }    }};const bind = (config = {}) => {    // normalize config    const portal = config.portal || '';    const statement = config.statement || '';    const binary = config.binary || false;    const values = config.values || emptyArray;    const len = values.length;    writer.addCString(portal).addCString(statement);    writer.addInt16(len);    writeValues(values, config.valueMapper);    writer.addInt16(len);    writer.add(paramWriter.flush());    // format code    writer.addInt16(binary ? 1 /* BINARY */ : 0 /* STRING */);    return writer.flush(66 /* bind */);};const emptyExecute = Buffer.from([69 /* execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);const execute = (config) => {    // this is the happy path for most queries    if (!config || (!config.portal && !config.rows)) {        return emptyExecute;    }    const portal = config.portal || '';    const rows = config.rows || 0;    const portalLength = Buffer.byteLength(portal);    const len = 4 + portalLength + 1 + 4;    // one extra bit for code    const buff = Buffer.allocUnsafe(1 + len);    buff[0] = 69 /* execute */;    buff.writeInt32BE(len, 1);    buff.write(portal, 5, 'utf-8');    buff[portalLength + 5] = 0; // null terminate portal cString    buff.writeUInt32BE(rows, buff.length - 4);    return buff;};const cancel = (processID, secretKey) => {    const buffer = Buffer.allocUnsafe(16);    buffer.writeInt32BE(16, 0);    buffer.writeInt16BE(1234, 4);    buffer.writeInt16BE(5678, 6);    buffer.writeInt32BE(processID, 8);    buffer.writeInt32BE(secretKey, 12);    return buffer;};const cstringMessage = (code, string) => {    const stringLen = Buffer.byteLength(string);    const len = 4 + stringLen + 1;    // one extra bit for code    const buffer = Buffer.allocUnsafe(1 + len);    buffer[0] = code;    buffer.writeInt32BE(len, 1);    buffer.write(string, 5, 'utf-8');    buffer[len] = 0; // null terminate cString    return buffer;};const emptyDescribePortal = writer.addCString('P').flush(68 /* describe */);const emptyDescribeStatement = writer.addCString('S').flush(68 /* describe */);const describe = (msg) => {    return msg.name        ? cstringMessage(68 /* describe */, `${msg.type}${msg.name || ''}`)        : msg.type === 'P'            ? emptyDescribePortal            : emptyDescribeStatement;};const close = (msg) => {    const text = `${msg.type}${msg.name || ''}`;    return cstringMessage(67 /* close */, text);};const copyData = (chunk) => {    return writer.add(chunk).flush(100 /* copyFromChunk */);};const copyFail = (message) => {    return cstringMessage(102 /* copyFail */, message);};const codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);const flushBuffer = codeOnlyBuffer(72 /* flush */);const syncBuffer = codeOnlyBuffer(83 /* sync */);const endBuffer = codeOnlyBuffer(88 /* end */);const copyDoneBuffer = codeOnlyBuffer(99 /* copyDone */);const serialize = {    startup,    password,    requestSsl,    sendSASLInitialResponseMessage,    sendSCRAMClientFinalMessage,    query,    parse,    bind,    execute,    describe,    close,    flush: () => flushBuffer,    sync: () => syncBuffer,    end: () => endBuffer,    copyData,    copyDone: () => copyDoneBuffer,    copyFail,    cancel,};exports.serialize = serialize;//# sourceMappingURL=serializer.js.map
 |