-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Decouple serializing messages w/ writing them to socket (#2155)
* Move message writing to typescript lib * Write more tests, cleanup code to some extent * Rename package to something more representing its name * Remove unused code * Small tweaks based on microbenchmarks * Rename w/o underscore
- Loading branch information
Showing
17 changed files
with
685 additions
and
188 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 2 additions & 1 deletion
3
packages/pg-packet-stream/package.json → packages/pg-protocol/package.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// file for microbenchmarking | ||
|
||
import { Writer } from './buffer-writer' | ||
import { serialize } from './index' | ||
|
||
const LOOPS = 1000 | ||
let count = 0 | ||
let start = Date.now() | ||
const writer = new Writer() | ||
|
||
const run = () => { | ||
if (count > LOOPS) { | ||
console.log(Date.now() - start) | ||
return; | ||
} | ||
count++ | ||
for(let i = 0; i < LOOPS; i++) { | ||
serialize.describe({ type: 'P'}) | ||
serialize.describe({ type: 'S'}) | ||
} | ||
setImmediate(run) | ||
} | ||
|
||
run() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
//binary data writer tuned for encoding binary specific to the postgres binary protocol | ||
|
||
export class Writer { | ||
private buffer: Buffer; | ||
private offset: number = 5; | ||
private headerPosition: number = 0; | ||
constructor(private size = 256) { | ||
this.buffer = Buffer.alloc(size) | ||
} | ||
|
||
private ensure(size: number): void { | ||
var remaining = this.buffer.length - this.offset; | ||
if (remaining < size) { | ||
var oldBuffer = this.buffer; | ||
// exponential growth factor of around ~ 1.5 | ||
// https://stackoverflow.com/questions/2269063/buffer-growth-strategy | ||
var newSize = oldBuffer.length + (oldBuffer.length >> 1) + size; | ||
this.buffer = Buffer.alloc(newSize); | ||
oldBuffer.copy(this.buffer); | ||
} | ||
} | ||
|
||
public addInt32(num: number): Writer { | ||
this.ensure(4); | ||
this.buffer[this.offset++] = (num >>> 24 & 0xFF); | ||
this.buffer[this.offset++] = (num >>> 16 & 0xFF); | ||
this.buffer[this.offset++] = (num >>> 8 & 0xFF); | ||
this.buffer[this.offset++] = (num >>> 0 & 0xFF); | ||
return this; | ||
} | ||
|
||
public addInt16(num: number): Writer { | ||
this.ensure(2); | ||
this.buffer[this.offset++] = (num >>> 8 & 0xFF); | ||
this.buffer[this.offset++] = (num >>> 0 & 0xFF); | ||
return this; | ||
} | ||
|
||
|
||
public addCString(string: string): Writer { | ||
if (!string) { | ||
this.ensure(1); | ||
} else { | ||
var len = Buffer.byteLength(string); | ||
this.ensure(len + 1); // +1 for null terminator | ||
this.buffer.write(string, this.offset, 'utf-8') | ||
this.offset += len; | ||
} | ||
|
||
this.buffer[this.offset++] = 0; // null terminator | ||
return this; | ||
} | ||
|
||
public addString(string: string = ""): Writer { | ||
var len = Buffer.byteLength(string); | ||
this.ensure(len); | ||
this.buffer.write(string, this.offset); | ||
this.offset += len; | ||
return this; | ||
} | ||
|
||
public add(otherBuffer: Buffer): Writer { | ||
this.ensure(otherBuffer.length); | ||
otherBuffer.copy(this.buffer, this.offset); | ||
this.offset += otherBuffer.length; | ||
return this; | ||
} | ||
|
||
private join(code?: number): Buffer { | ||
if (code) { | ||
this.buffer[this.headerPosition] = code; | ||
//length is everything in this packet minus the code | ||
const length = this.offset - (this.headerPosition + 1) | ||
this.buffer.writeInt32BE(length, this.headerPosition + 1) | ||
} | ||
return this.buffer.slice(code ? 0 : 5, this.offset); | ||
} | ||
|
||
public flush(code?: number): Buffer { | ||
var result = this.join(code); | ||
this.offset = 5; | ||
this.headerPosition = 0; | ||
this.buffer = Buffer.allocUnsafe(this.size) | ||
return result; | ||
} | ||
} | ||
|
2 changes: 1 addition & 1 deletion
2
...-packet-stream/src/inbound-parser.test.ts → ...es/pg-protocol/src/inbound-parser.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import { BackendMessage } from './messages'; | ||
import { serialize } from './serializer'; | ||
import { Parser, MessageCallback } from './parser' | ||
|
||
export function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void> { | ||
const parser = new Parser() | ||
stream.on('data', (buffer: Buffer) => parser.parse(buffer, callback)) | ||
return new Promise((resolve) => stream.on('end', () => resolve())) | ||
} | ||
|
||
export { serialize }; |
File renamed without changes.
Oops, something went wrong.