From c9a005d7cb8167eb4cd0b189540c5ae54fa345de Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Tue, 23 Apr 2019 12:40:57 -0400 Subject: [PATCH] Add linter, code prettifier, fix style issues --- .editorconfig | 2 +- .prettierrc | 8 +++ package.json | 5 +- src/buffer.ts | 143 ++++++++++++++++++++----------------------- src/chars.ts | 63 +++++++++---------- src/client.ts | 138 ++++++++++++++++++++--------------------- src/ring.ts | 18 +++--- test/buffers.test.ts | 21 +++---- test/client.test.ts | 7 +-- test/ring.test.ts | 2 +- tslint.json | 32 ++++++++++ yarn.lock | 50 ++++++++++++++- 12 files changed, 282 insertions(+), 207 deletions(-) create mode 100644 .prettierrc create mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig index 13a1b60a8..13c482797 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,6 +4,6 @@ root = true trim_trailing_whitespace = true insert_final_newline = true -[*.{js,ts}] +[*.{js,ts,json}] indent_size = 2 indent_style = space diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..169e0e680 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "semi": true, + "trailingComma": "es5", + "bracketSpacing": false, + "arrowParens": "always" +} diff --git a/package.json b/package.json index 640100f76..4d06c928d 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,14 @@ "@types/jest": "^24.0.11", "@types/node": "^11.13.5", "jest": "^24.7.1", + "prettier": "^1.17.0", "ts-jest": "^24.0.2", + "tslint": "^5.16.0", "typescript": "^3.4.3" }, "scripts": { "build": "tsc", - "test": "jest" + "test": "jest", + "lint": "tslint 'src/**/*.ts'" } } diff --git a/src/buffer.ts b/src/buffer.ts index 368b7b511..06a3ee87a 100644 --- a/src/buffer.ts +++ b/src/buffer.ts @@ -1,6 +1,5 @@ -import char, * as chars from './chars'; -import {RingBuffer} from './ring'; - +import char, * as chars from "./chars"; +import {RingBuffer} from "./ring"; /* WriteBuffer over-allocation */ const BUFFER_INC_SIZE: number = 4096; @@ -12,10 +11,8 @@ const BUFFER_RING_CAPACITY: number = 1024; const EMPTY_BUFFER = Buffer.allocUnsafe(0); - export class BufferError extends Error {} - export class WriteBuffer { private buffer: Buffer; private size: number; @@ -30,7 +27,7 @@ export class WriteBuffer { } private ensureAlloced(extraLength: number): void { - let newSize: number = this.pos + extraLength; + const newSize: number = this.pos + extraLength; if (newSize > this.size) { this.__realloc(newSize); } @@ -38,7 +35,7 @@ export class WriteBuffer { private __realloc(newSize: number): void { newSize += BUFFER_INC_SIZE; - let newBuffer = Buffer.allocUnsafe(newSize); + const newBuffer = Buffer.allocUnsafe(newSize); this.buffer.copy(newBuffer, 0, 0, this.pos); this.buffer = newBuffer; } @@ -46,7 +43,8 @@ export class WriteBuffer { beginMessage(mtype: char): this { if (this.messagePos >= 0) { throw new BufferError( - 'cannot begin a new message: the previous message is not finished'); + "cannot begin a new message: the previous message is not finished" + ); } this.ensureAlloced(5); this.buffer.writeUInt8(mtype, this.pos); @@ -58,19 +56,20 @@ export class WriteBuffer { endMessage(): this { if (this.messagePos < 0) { - throw new BufferError( - 'cannot end the message: no current message'); + throw new BufferError("cannot end the message: no current message"); } - this.buffer.writeInt32BE(this.pos - this.messagePos - 1, - this.messagePos + 1); + this.buffer.writeInt32BE( + this.pos - this.messagePos - 1, + this.messagePos + 1 + ); this.messagePos = -1; return this; } writeChar(ch: char): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeChar: no current message'); + throw new BufferError("cannot writeChar: no current message"); } this.ensureAlloced(1); this.buffer.writeUInt8(ch, this.pos); @@ -80,10 +79,10 @@ export class WriteBuffer { writeString(s: string): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeString: no current message'); + throw new BufferError("cannot writeString: no current message"); } - let buf: Buffer = Buffer.from(s, 'utf-8'); + const buf: Buffer = Buffer.from(s, "utf-8"); this.ensureAlloced(buf.length + 4); this.buffer.writeInt32BE(buf.length, this.pos); this.pos += 4; @@ -94,7 +93,7 @@ export class WriteBuffer { writeInt16(i: number): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeInt16: no current message'); + throw new BufferError("cannot writeInt16: no current message"); } this.ensureAlloced(2); @@ -105,7 +104,7 @@ export class WriteBuffer { writeInt32(i: number): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeInt32: no current message'); + throw new BufferError("cannot writeInt32: no current message"); } this.ensureAlloced(4); @@ -116,7 +115,7 @@ export class WriteBuffer { writeUInt16(i: number): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeInt16: no current message'); + throw new BufferError("cannot writeInt16: no current message"); } this.ensureAlloced(2); @@ -127,7 +126,7 @@ export class WriteBuffer { writeUInt32(i: number): this { if (this.messagePos < 0) { - throw new BufferError('cannot writeInt32: no current message'); + throw new BufferError("cannot writeInt32: no current message"); } this.ensureAlloced(4); @@ -139,13 +138,13 @@ export class WriteBuffer { unwrap(): Buffer { if (this.messagePos >= 0) { throw new BufferError( - 'cannot unwrap: an unfinished message is in the buffer'); + "cannot unwrap: an unfinished message is in the buffer" + ); } return this.buffer.slice(0, this.pos); } } - export class ReadBuffer { private bufs: RingBuffer; private len: number; @@ -182,8 +181,7 @@ export class ReadBuffer { this.len0 = buf.length; this.pos0 = 0; this.len = this.len0; - } - else { + } else { this.bufs.enq(buf); this.len += buf.length; } @@ -192,31 +190,28 @@ export class ReadBuffer { } private ensureFirstBuf(): Buffer { - if (this.pos0 == this.len0) { + if (this.pos0 === this.len0) { this.__nextBuf(); } - let buf0 = this.buf0; + const buf0 = this.buf0; if (buf0 == null || buf0.length < 1) { - throw new BufferError('empty buffer') + throw new BufferError("empty buffer"); } return buf0; } private checkOverread(size: number): void { - if ( - (this.curMessageLenUnread < size) || - (size > this.len) - ) { - throw new BufferError('buffer overread') + if (this.curMessageLenUnread < size || size > this.len) { + throw new BufferError("buffer overread"); } } private __nextBuf(): void { // Only called from ensureFirstBuf(). This part // is factored out to let ensureFirstBuf() be inlined. - let nextBuf = this.bufs.deq(); + const nextBuf = this.bufs.deq(); if (nextBuf == null) { - throw new BufferError('buffer overread'); + throw new BufferError("buffer overread"); } this.buf0 = nextBuf; @@ -228,15 +223,14 @@ export class ReadBuffer { this.ensureFirstBuf(); while (true) { if (this.pos0 + size > this.len0) { - let nread = this.len0 - this.pos0; + const nread = this.len0 - this.pos0; this.pos0 = this.len0; this.len -= nread; size -= nread; this.ensureFirstBuf(); - } - else { + } else { this.pos0 += size; this.len -= size; break; @@ -252,12 +246,12 @@ export class ReadBuffer { } private __readBufferCopy(buf0: Buffer, size: number): Buffer { - let ret = Buffer.allocUnsafe(size); + const ret = Buffer.allocUnsafe(size); let retPos = 0; while (true) { if (this.pos0 + size > this.len0) { - let nread = this.len0 - this.pos0; + const nread = this.len0 - this.pos0; buf0.copy(ret, retPos, this.pos0, nread); retPos += nread; @@ -267,8 +261,7 @@ export class ReadBuffer { size -= nread; buf0 = this.ensureFirstBuf(); - } - else { + } else { buf0.copy(ret, retPos, this.pos0, size); this.pos0 += size; this.len -= size; @@ -280,16 +273,16 @@ export class ReadBuffer { } private _readBuffer(size: number): Buffer { - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); - if (size == 0) { + if (size === 0) { return EMPTY_BUFFER; } if (this.pos0 + size < this.len0) { // If the requested *size* fits in the first buffer // do a slice operation. - let ret = buf0.slice(this.pos0, this.pos0 + size); + const ret = buf0.slice(this.pos0, this.pos0 + size); this.pos0 += size; this.len -= size; return ret; @@ -300,15 +293,15 @@ export class ReadBuffer { readBuffer(size: number): Buffer { this.checkOverread(size); - let buf = this._readBuffer(size); + const buf = this._readBuffer(size); this.curMessageLenUnread -= size; return buf; } readChar(): char { this.checkOverread(1); - let buf0 = this.ensureFirstBuf(); - let ret = buf0.readUInt8(this.pos0); + const buf0 = this.ensureFirstBuf(); + const ret = buf0.readUInt8(this.pos0); this.pos0++; this.curMessageLenUnread--; return ret; @@ -316,76 +309,76 @@ export class ReadBuffer { readInt16(): number { this.checkOverread(2); - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); if (this.pos0 + 2 < this.len0) { - let ret = buf0.readInt16BE(this.pos0); + const ret = buf0.readInt16BE(this.pos0); this.pos0 += 2; this.curMessageLenUnread -= 2; return ret; } - let buf = this._readBuffer(2); + const buf = this._readBuffer(2); this.curMessageLenUnread -= 2; return buf.readInt16BE(0); } readInt32(): number { this.checkOverread(4); - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); if (this.pos0 + 4 < this.len0) { - let ret = buf0.readInt32BE(this.pos0); + const ret = buf0.readInt32BE(this.pos0); this.pos0 += 4; this.curMessageLenUnread -= 4; return ret; } - let buf = this._readBuffer(4); + const buf = this._readBuffer(4); this.curMessageLenUnread -= 4; return buf.readInt32BE(0); } readUInt16(): number { this.checkOverread(2); - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); if (this.pos0 + 2 < this.len0) { - let ret = buf0.readUInt16BE(this.pos0); + const ret = buf0.readUInt16BE(this.pos0); this.pos0 += 2; this.curMessageLenUnread -= 2; return ret; } - let buf = this._readBuffer(2); + const buf = this._readBuffer(2); this.curMessageLenUnread -= 2; return buf.readUInt16BE(0); } readUInt32(): number { this.checkOverread(4); - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); if (this.pos0 + 4 < this.len0) { - let ret = buf0.readUInt32BE(this.pos0); + const ret = buf0.readUInt32BE(this.pos0); this.pos0 += 4; this.curMessageLenUnread -= 4; return ret; } - let buf = this._readBuffer(4); + const buf = this._readBuffer(4); this.curMessageLenUnread -= 4; return buf.readUInt32BE(0); } readString(): string { - let len = this.readInt32(); - let buf = this.readBuffer(len); - return buf.toString('utf-8'); + const len = this.readInt32(); + const buf = this.readBuffer(len); + return buf.toString("utf-8"); } readLenPrefixedBuffer(): Buffer { - let len = this.readInt32(); + const len = this.readInt32(); return this.readBuffer(len); } @@ -398,7 +391,7 @@ export class ReadBuffer { if (this.len < 1) { return false; } - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); this.curMessageType = buf0.readUInt8(this.pos0); this.pos0++; } @@ -407,13 +400,12 @@ export class ReadBuffer { if (this.len < 4) { return false; } - let buf0 = this.ensureFirstBuf(); + const buf0 = this.ensureFirstBuf(); if (this.pos0 + 4 < this.len0) { this.curMessageLen = buf0.readInt32BE(this.pos0); this.pos0 += 4; - } - else { - let buf = this._readBuffer(4); + } else { + const buf = this._readBuffer(4); this.curMessageLen = buf.readInt32BE(0); } @@ -438,9 +430,9 @@ export class ReadBuffer { } if (this.len >= 1) { - let buf0 = this.ensureFirstBuf(); - let unreadMessageType = buf0.readUInt8(this.pos0); - return (mtype === unreadMessageType) && this.takeMessage(); + const buf0 = this.ensureFirstBuf(); + const unreadMessageType = buf0.readUInt8(this.pos0); + return mtype === unreadMessageType && this.takeMessage(); } return false; @@ -448,17 +440,17 @@ export class ReadBuffer { putMessage(): void { if (!this.curMessageReady) { - throw new BufferError('cannot put message: no message taken'); + throw new BufferError("cannot put message: no message taken"); } if (this.curMessageLenUnread !== this.curMessageLen - 4) { - throw new BufferError('cannot put message: message is partially read'); + throw new BufferError("cannot put message: message is partially read"); } this.curMessageReady = false; } discardMessage(): void { if (!this.curMessageReady) { - throw new BufferError('no message to discard'); + throw new BufferError("no message to discard"); } if (this.curMessageLenUnread > 0) { this.discardBuffer(this.curMessageLenUnread); @@ -468,7 +460,7 @@ export class ReadBuffer { consumeMessage(): Buffer { if (!this.curMessageReady) { - throw new BufferError('no message to consume'); + throw new BufferError("no message to consume"); } let buf: Buffer = EMPTY_BUFFER; @@ -490,7 +482,8 @@ export class ReadBuffer { if (this.curMessageLenUnread) { throw new BufferError( `cannot finishMessage: unread data in message ` + - `"${chars.chr(this.curMessageType)}"`) + `"${chars.chr(this.curMessageType)}"` + ); } this._finishMessage(); diff --git a/src/chars.ts b/src/chars.ts index 7589696b9..374d879e2 100644 --- a/src/chars.ts +++ b/src/chars.ts @@ -3,48 +3,45 @@ type char = number; export default char; - -export const $0: char = ord('0'); -export const $1: char = ord('1'); - -export const $C: char = ord('C'); -export const $D: char = ord('D'); -export const $E: char = ord('E'); -export const $H: char = ord('H'); -export const $I: char = ord('I'); -export const $K: char = ord('K'); -export const $L: char = ord('L'); -export const $O: char = ord('O'); -export const $P: char = ord('P'); -export const $Q: char = ord('Q'); -export const $R: char = ord('R'); -export const $S: char = ord('S'); -export const $T: char = ord('T'); -export const $V: char = ord('V'); -export const $Y: char = ord('Y'); -export const $Z: char = ord('Z'); - -export const $b: char = ord('b'); -export const $j: char = ord('j'); -export const $m: char = ord('m'); -export const $n: char = ord('n'); -export const $o: char = ord('o'); -export const $p: char = ord('p'); -export const $v: char = ord('v'); - +export const $0: char = ord("0"); +export const $1: char = ord("1"); + +export const $C: char = ord("C"); +export const $D: char = ord("D"); +export const $E: char = ord("E"); +export const $H: char = ord("H"); +export const $I: char = ord("I"); +export const $K: char = ord("K"); +export const $L: char = ord("L"); +export const $O: char = ord("O"); +export const $P: char = ord("P"); +export const $Q: char = ord("Q"); +export const $R: char = ord("R"); +export const $S: char = ord("S"); +export const $T: char = ord("T"); +export const $V: char = ord("V"); +export const $Y: char = ord("Y"); +export const $Z: char = ord("Z"); + +export const $b: char = ord("b"); +export const $j: char = ord("j"); +export const $m: char = ord("m"); +export const $n: char = ord("n"); +export const $o: char = ord("o"); +export const $p: char = ord("p"); +export const $v: char = ord("v"); export function ord(str: string): char { - let ch: char = str.charCodeAt(0); + const ch: char = str.charCodeAt(0); if (ch <= 0 || ch >= 255) { - throw new TypeError(`char "${ch}" is outside ASCII`) + throw new TypeError(`char "${ch}" is outside ASCII`); } return ch; } - export function chr(ch: char): string { if (ch <= 0 || ch >= 255) { - throw new TypeError(`char "${ch}" is outside ASCII`) + throw new TypeError(`char "${ch}" is outside ASCII`); } return String.fromCharCode(ch); } diff --git a/src/client.ts b/src/client.ts index 22c10249e..9f1554c7f 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,43 +1,41 @@ -import {WriteBuffer, ReadBuffer} from './buffer'; -import char, * as chars from './chars'; - -import * as net from 'net'; +import {ReadBuffer, WriteBuffer} from "./buffer"; +import char, * as chars from "./chars"; +import * as net from "net"; export interface ConnectConfig { - port?: number, - host?: string, + port?: number; + host?: string; } - enum AuthenticationStatuses { AUTH_OK = 0, AUTH_SASL = 10, AUTH_SASL_CONTINUE = 11, - AUTH_SASL_FINAL = 12 + AUTH_SASL_FINAL = 12, } - enum TransactionStatus { - TRANS_IDLE = 0, // connection idle - TRANS_ACTIVE = 1, // command in progress - TRANS_INTRANS = 2, // idle, within transaction block - TRANS_INERROR = 3, // idle, within failed transaction - TRANS_UNKNOWN = 4, // cannot determine status + TRANS_IDLE = 0, // connection idle + TRANS_ACTIVE = 1, // command in progress + TRANS_INTRANS = 2, // idle, within transaction block + TRANS_INERROR = 3, // idle, within failed transaction + TRANS_UNKNOWN = 4, // cannot determine status } - export type onConnect = (err: Error | null, con: Connection | null) => void; - export default function connect( - options?: ConnectConfig): Promise; + options?: ConnectConfig +): Promise; export default function connect( - options?: ConnectConfig, callback?: onConnect): void; + options?: ConnectConfig, + callback?: onConnect +): void; export default function connect( - options?: ConnectConfig, - callback?: onConnect): Promise | void -{ + options?: ConnectConfig, + callback?: onConnect +): Promise | void { if (callback) { AwaitConnection.connect(options) .then((conn) => { @@ -46,13 +44,11 @@ export default function connect( .catch((error) => { callback(error, null); }); - } - else { + } else { return AwaitConnection.connect(options); } } - class AwaitConnection { private sock: net.Socket; private paused: boolean; @@ -71,7 +67,7 @@ class AwaitConnection { private connWaiterReject: ((value: any) => void) | null; private constructor(sock: net.Socket) { - this.buffer = new ReadBuffer; + this.buffer = new ReadBuffer(); this.serverSecret = -1; this.serverSettings = new Map(); @@ -85,14 +81,13 @@ class AwaitConnection { this.connWaiter = new Promise((resolve, reject) => { this.connWaiterResolve = resolve; this.connWaiterReject = reject; - }) + }); this.paused = false; this.sock = sock; - this.sock.on('error', this.onError.bind(this)); - this.sock.on('data', this.onData.bind(this)); - this.sock.on('connect', this.onConnect.bind(this)); - + this.sock.on("error", this.onError.bind(this)); + this.sock.on("data", this.onData.bind(this)); + this.sock.on("connect", this.onConnect.bind(this)); } private async waitForMessage(): Promise { @@ -108,7 +103,7 @@ class AwaitConnection { await new Promise((resolve, reject) => { this.messageWaiterResolve = resolve; this.messageWaiterReject = reject; - }) + }); } private onConnect() { @@ -134,7 +129,7 @@ class AwaitConnection { } private onData(data: Buffer): void { - let pause = this.buffer.feed(data); + const pause = this.buffer.feed(data); if (pause) { this.paused = true; @@ -151,11 +146,11 @@ class AwaitConnection { } private parseHeaders(): Map { - let ret = new Map(); + const ret = new Map(); let numFields = this.buffer.readInt16(); while (numFields) { - let key = this.buffer.readInt16(); - let value = this.buffer.readLenPrefixedBuffer(); + const key = this.buffer.readInt16(); + const value = this.buffer.readLenPrefixedBuffer(); ret.set(key, value); numFields--; } @@ -163,18 +158,18 @@ class AwaitConnection { } private parseErrorMessage(): Error { - let severity = this.buffer.readChar(); - let code = this.buffer.readUInt32(); - let message = this.buffer.readString(); - let attrs = this.parseHeaders(); + const severity = this.buffer.readChar(); + const code = this.buffer.readUInt32(); + const message = this.buffer.readString(); + const attrs = this.parseHeaders(); - let err = new Error(message); + const err = new Error(message); return err; } private parseSyncMessage(): void { - this.parseHeaders(); // TODO: Reject Headers - let status = this.buffer.readChar(); + this.parseHeaders(); // TODO: Reject Headers + const status = this.buffer.readChar(); switch (status) { case chars.$I: this.serverXactStatus = TransactionStatus.TRANS_IDLE; @@ -193,38 +188,43 @@ class AwaitConnection { } private fallthrough(): void { - let mtype = this.buffer.getMessageType(); + const mtype = this.buffer.getMessageType(); switch (mtype) { case chars.$S: { - let name = this.buffer.readString(); - let value = this.buffer.readString(); + const name = this.buffer.readString(); + const value = this.buffer.readString(); this.serverSettings.set(name, value); this.buffer.finishMessage(); break; } case chars.$L: { - let severity = this.buffer.readChar(); - let code = this.buffer.readUInt32(); - let message = this.buffer.readString(); + const severity = this.buffer.readChar(); + const code = this.buffer.readUInt32(); + const message = this.buffer.readString(); this.parseHeaders(); this.buffer.finishMessage(); - console.info('SERVER MESSAGE', severity, code, message); + + /* tslint:disable */ + console.info("SERVER MESSAGE", severity, code, message); + /* tslint:enable */ + break; } default: // TODO: terminate connection throw new Error( - `unexpected message type ${mtype} ("${chars.chr(mtype)}")`) + `unexpected message type ${mtype} ("${chars.chr(mtype)}")` + ); } } private async connect() { await this.connWaiter; - let wb = new WriteBuffer; + const wb = new WriteBuffer(); wb.beginMessage(chars.$V) .writeInt16(1) @@ -233,8 +233,8 @@ class AwaitConnection { .endMessage(); wb.beginMessage(chars.$0) - .writeString('edgedb') // TODO - .writeString('edgedb') + .writeString("edgedb") // TODO + .writeString("edgedb") .endMessage(); this.sock.write(wb.unwrap()); @@ -244,19 +244,20 @@ class AwaitConnection { await this.waitForMessage(); } - let mtype = this.buffer.getMessageType(); + const mtype = this.buffer.getMessageType(); switch (mtype) { case chars.$v: { - let hi = this.buffer.readInt16(); - let lo = this.buffer.readInt16(); + const hi = this.buffer.readInt16(); + const lo = this.buffer.readInt16(); this.parseHeaders(); this.buffer.finishMessage(); if (hi !== 1 || lo !== 0) { throw new Error( `the server requested an unsupported version of ` + - `the protocol ${hi}.${lo}`); + `the protocol ${hi}.${lo}` + ); } break; } @@ -267,7 +268,7 @@ class AwaitConnection { } case chars.$R: { - let status = this.buffer.readInt32(); + const status = this.buffer.readInt32(); if (status === AuthenticationStatuses.AUTH_OK) { this.buffer.finishMessage(); @@ -277,8 +278,8 @@ class AwaitConnection { // TODO: Abort the connection throw new Error( `unsupported authentication method requested by the ` + - `server: ${status}` - ) + `server: ${status}` + ); } break; @@ -305,24 +306,23 @@ class AwaitConnection { } } - private static newSock( - {port=5656, host='localhost'}: ConnectConfig = {} - ): net.Socket - { + private static newSock({ + port = 5656, + host = "localhost", + }: ConnectConfig = {}): net.Socket { return net.createConnection(port, host); } static async connect(config: ConnectConfig = {}): Promise { - let sock = this.newSock(config); - let conn = new this(sock); - await conn.connect() + const sock = this.newSock(config); + const conn = new this(sock); + await conn.connect(); return conn; } } - class Connection { static wrap(conn: AwaitConnection): Connection { - return new Connection; + return new Connection(); } } diff --git a/src/ring.ts b/src/ring.ts index 76e4ff2a0..676d55c64 100644 --- a/src/ring.ts +++ b/src/ring.ts @@ -1,6 +1,5 @@ export class RingBufferError extends Error {} - export class RingBuffer { private buffer: Array; private len: number; @@ -8,11 +7,9 @@ export class RingBuffer { private writer: number; private capacity: number; - constructor( - {capacity} : {capacity: number} - ) { - if (capacity <= 0 || capacity >= 0xFFFFFFFF) { - throw new RingBufferError('invalid capacity'); + constructor({capacity}: {capacity: number}) { + if (capacity <= 0 || capacity >= 0xffffffff) { + throw new RingBufferError("invalid capacity"); } this.buffer = new Array(capacity); @@ -31,10 +28,11 @@ export class RingBuffer { } enq(data: T): void { - let nextWriter = (this.writer + 1) % this.capacity; + const nextWriter = (this.writer + 1) % this.capacity; if (this.reader === nextWriter) { throw new RingBufferError( - `RingBuffer(capacity=${this.capacity}) is full`); + `RingBuffer(capacity=${this.capacity}) is full` + ); } this.buffer[this.writer] = data; @@ -47,8 +45,8 @@ export class RingBuffer { return undefined; } - let ret = this.buffer[this.reader]; - this.buffer[this.reader] = undefined; // let it GC + const ret = this.buffer[this.reader]; + this.buffer[this.reader] = undefined; // let it GC this.reader = (this.reader + 1) % this.capacity; this.len--; return ret; diff --git a/test/buffers.test.ts b/test/buffers.test.ts index d046f26d2..f974dd982 100644 --- a/test/buffers.test.ts +++ b/test/buffers.test.ts @@ -1,9 +1,9 @@ -import {WriteBuffer, BufferError} from '../src/buffer'; +import {BufferError, WriteBuffer} from '../src/buffer'; import * as chars from '../src/chars'; test('matches edgedb-python packing', () => { - let w: WriteBuffer = new WriteBuffer(); + const w: WriteBuffer = new WriteBuffer(); w.beginMessage(chars.$E) .writeUInt16(10) @@ -14,35 +14,34 @@ test('matches edgedb-python packing', () => { .writeString('bbbbbbbbb') .endMessage(); - let buf: Buffer = w.unwrap(); + const buf: Buffer = w.unwrap(); expect(buf.toString('base64')).toBe( - 'RQAAABAACgAAAAZhYWFhYWFQAAAAFQAPQkEAAAAJYmJiYmJiYmJi' - ) + 'RQAAABAACgAAAAZhYWFhYWFQAAAAFQAPQkEAAAAJYmJiYmJiYmJi'); }); test('maintains internal messages integrity', () => { - let w: WriteBuffer = new WriteBuffer(); + const w: WriteBuffer = new WriteBuffer(); expect(() => { - w.writeInt16(10) + w.writeInt16(10); }).toThrowError(BufferError); expect(() => { - w.writeString('SELECT ...') + w.writeString('SELECT ...'); }).toThrowError(BufferError); expect(() => { - w.endMessage() + w.endMessage(); }).toThrowError(BufferError); w.beginMessage(chars.$E); expect(() => { - w.beginMessage(chars.$P) + w.beginMessage(chars.$P); }).toThrowError(BufferError); expect(() => { - w.unwrap() + w.unwrap(); }).toThrowError(BufferError); }); diff --git a/test/client.test.ts b/test/client.test.ts index d564f260e..f127ee5be 100644 --- a/test/client.test.ts +++ b/test/client.test.ts @@ -1,13 +1,12 @@ import connect from '../src/index'; -test('connect', async() => { - let con1 = await connect(); +test('connect', async () => { + const con1 = await connect(); // let con2 = await connect({port: 7777}); // let con3 = connect({}, function(err, con) { // }) -}) - +}); diff --git a/test/ring.test.ts b/test/ring.test.ts index 478aec089..2bc54ff3b 100644 --- a/test/ring.test.ts +++ b/test/ring.test.ts @@ -2,7 +2,7 @@ import {RingBuffer, RingBufferError} from '../src/ring'; test('basic operations', () => { - let d = new RingBuffer({capacity: 3}); + const d = new RingBuffer({capacity: 3}); expect(d.length).toBe(0); expect(d.full).toBeFalsy(); diff --git a/tslint.json b/tslint.json new file mode 100644 index 000000000..54af4c1ff --- /dev/null +++ b/tslint.json @@ -0,0 +1,32 @@ +{ + "extends": "tslint:recommended", + "rules": { + "max-line-length": { + "options": [79] + }, + "new-parens": true, + "no-arg": true, + "no-bitwise": true, + "no-conditional-assignment": true, + "no-consecutive-blank-lines": [true, 2], + "no-angle-bracket-type-assertion": false, + "interface-name": false, + "member-ordering": false, + "member-access": false, + "trailing-comma": false, + "quotemark": false, + "max-classes-per-file": false, + "one-line": false, + "whitespace": [ + true, + "check-branch", + "check-operator", + "check-decl", + "check-type", + "check-type-operator" + ], + "no-console": { + "severity": "warning" + } + } +} diff --git a/yarn.lock b/yarn.lock index e7b80d705..ebd6b767a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -649,6 +649,11 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -691,7 +696,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -766,7 +771,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@~2.20.0: +commander@^2.12.1, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -942,6 +947,11 @@ diff-sequences@^24.3.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -2756,6 +2766,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prettier@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" + integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== + pretty-format@^24.7.0: version "24.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" @@ -3417,6 +3432,37 @@ ts-jest@^24.0.2: semver "^5.5" yargs-parser "10.x" +tslib@^1.8.0, tslib@^1.8.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67" + integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.13.0" + minimatch "^3.0.4" + mkdirp "^0.5.1" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"