tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
68 lines (65 loc) • 8.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Parser = void 0;
var _events = require("events");
var _streamParser = _interopRequireDefault(require("./stream-parser"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* Parses the tokens of a message and dispatches them to a `TokenHandler`.
*
* Emits `'end'` once all tokens were handled, or `'error'` if parsing or
* handling a token failed.
*/
class Parser extends _events.EventEmitter {
constructor(message, debug, handler, options) {
super();
this.debug = debug;
this.options = options;
this.paused = false;
this.onResume = undefined;
// Emit outside of the promise chain, so an exception thrown by a listener
// is an uncaught exception (like on master), not an unhandled rejection.
this.run(message, handler).then(() => {
process.nextTick(() => this.emit('end'));
}, error => {
process.nextTick(() => this.emit('error', error));
});
}
async run(message, handler) {
const parser = new _streamParser.default(this.options);
// Iterate manually - unlike `for await`, this does not destroy the message
// if parsing fails.
const iterator = Symbol.asyncIterator in message ? message[Symbol.asyncIterator]() : message[Symbol.iterator]();
let result;
while (!(result = await iterator.next()).done) {
parser.write(result.value);
while (true) {
while (this.paused) {
await new Promise(resolve => {
this.onResume = resolve;
});
}
const token = parser.read();
if (token === undefined) {
break;
}
this.debug.token(token);
handler[token.handlerName](token);
}
}
parser.end();
}
pause() {
this.paused = true;
}
resume() {
this.paused = false;
const onResume = this.onResume;
this.onResume = undefined;
onResume?.();
}
}
exports.Parser = Parser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl9zdHJlYW1QYXJzZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUGFyc2VyIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwiZGVidWciLCJoYW5kbGVyIiwib3B0aW9ucyIsInBhdXNlZCIsIm9uUmVzdW1lIiwidW5kZWZpbmVkIiwicnVuIiwidGhlbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImVtaXQiLCJlcnJvciIsInBhcnNlciIsIlN0cmVhbVBhcnNlciIsIml0ZXJhdG9yIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInJlc3VsdCIsIm5leHQiLCJkb25lIiwid3JpdGUiLCJ2YWx1ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidG9rZW4iLCJyZWFkIiwiaGFuZGxlck5hbWUiLCJlbmQiLCJwYXVzZSIsInJlc3VtZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vdG9rZW4tc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IFN0cmVhbVBhcnNlciwgeyB0eXBlIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3N0cmVhbS1wYXJzZXInO1xuaW1wb3J0IERlYnVnIGZyb20gJy4uL2RlYnVnJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4uL21lc3NhZ2UnO1xuaW1wb3J0IHsgVG9rZW5IYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyJztcblxuLyoqXG4gKiBQYXJzZXMgdGhlIHRva2VucyBvZiBhIG1lc3NhZ2UgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byBhIGBUb2tlbkhhbmRsZXJgLlxuICpcbiAqIEVtaXRzIGAnZW5kJ2Agb25jZSBhbGwgdG9rZW5zIHdlcmUgaGFuZGxlZCwgb3IgYCdlcnJvcidgIGlmIHBhcnNpbmcgb3JcbiAqIGhhbmRsaW5nIGEgdG9rZW4gZmFpbGVkLlxuICovXG5leHBvcnQgY2xhc3MgUGFyc2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgZGVjbGFyZSBkZWJ1ZzogRGVidWc7XG4gIGRlY2xhcmUgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcblxuICBkZWNsYXJlIHBhdXNlZDogYm9vbGVhbjtcbiAgZGVjbGFyZSBvblJlc3VtZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IE1lc3NhZ2UgfCBJdGVyYWJsZTxCdWZmZXI+LCBkZWJ1ZzogRGVidWcsIGhhbmRsZXI6IFRva2VuSGFuZGxlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5vblJlc3VtZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEVtaXQgb3V0c2lkZSBvZiB0aGUgcHJvbWlzZSBjaGFpbiwgc28gYW4gZXhjZXB0aW9uIHRocm93biBieSBhIGxpc3RlbmVyXG4gICAgLy8gaXMgYW4gdW5jYXVnaHQgZXhjZXB0aW9uIChsaWtlIG9uIG1hc3RlciksIG5vdCBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgIHRoaXMucnVuKG1lc3NhZ2UsIGhhbmRsZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9LCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcnVuKG1lc3NhZ2U6IE1lc3NhZ2UgfCBJdGVyYWJsZTxCdWZmZXI+LCBoYW5kbGVyOiBUb2tlbkhhbmRsZXIpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3RyZWFtUGFyc2VyKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBJdGVyYXRlIG1hbnVhbGx5IC0gdW5saWtlIGBmb3IgYXdhaXRgLCB0aGlzIGRvZXMgbm90IGRlc3Ryb3kgdGhlIG1lc3NhZ2VcbiAgICAvLyBpZiBwYXJzaW5nIGZhaWxzLlxuICAgIGNvbnN0IGl0ZXJhdG9yOiBBc3luY0l0ZXJhdG9yPEJ1ZmZlcj4gfCBJdGVyYXRvcjxCdWZmZXI+ID0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gbWVzc2FnZSA/IG1lc3NhZ2VbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOiBtZXNzYWdlW1N5bWJvbC5pdGVyYXRvcl0oKTtcblxuICAgIGxldCByZXN1bHQ7XG4gICAgd2hpbGUgKCEocmVzdWx0ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICBwYXJzZXIud3JpdGUocmVzdWx0LnZhbHVlKTtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucGF1c2VkKSB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25SZXN1bWUgPSByZXNvbHZlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBwYXJzZXIucmVhZCgpO1xuICAgICAgICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZWJ1Zy50b2tlbih0b2tlbik7XG4gICAgICAgIGhhbmRsZXJbdG9rZW4uaGFuZGxlck5hbWVdKHRva2VuIGFzIGFueSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VyLmVuZCgpO1xuICB9XG5cbiAgZGVjbGFyZSBvbjogKFxuICAgICgoZXZlbnQ6ICdlbmQnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdGhpcykgJlxuICAgICgoZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPT4gdGhpcylcbiAgKTtcblxuICBwYXVzZSgpIHtcbiAgICB0aGlzLnBhdXNlZCA9IHRydWU7XG4gIH1cblxuICByZXN1bWUoKSB7XG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG9uUmVzdW1lID0gdGhpcy5vblJlc3VtZTtcbiAgICB0aGlzLm9uUmVzdW1lID0gdW5kZWZpbmVkO1xuICAgIG9uUmVzdW1lPy4oKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxhQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFBbUUsU0FBQUUsdUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFLbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUcsTUFBTSxTQUFTQyxvQkFBWSxDQUFDO0VBT3ZDQyxXQUFXQSxDQUFDQyxPQUFtQyxFQUFFQyxLQUFZLEVBQUVDLE9BQXFCLEVBQUVDLE9BQXNCLEVBQUU7SUFDNUcsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJLENBQUNGLEtBQUssR0FBR0EsS0FBSztJQUNsQixJQUFJLENBQUNFLE9BQU8sR0FBR0EsT0FBTztJQUV0QixJQUFJLENBQUNDLE1BQU0sR0FBRyxLQUFLO0lBQ25CLElBQUksQ0FBQ0MsUUFBUSxHQUFHQyxTQUFTOztJQUV6QjtJQUNBO0lBQ0EsSUFBSSxDQUFDQyxHQUFHLENBQUNQLE9BQU8sRUFBRUUsT0FBTyxDQUFDLENBQUNNLElBQUksQ0FBQyxNQUFNO01BQ3BDQyxPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUMsRUFBR0MsS0FBWSxJQUFLO01BQ25CSCxPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQ0MsSUFBSSxDQUFDLE9BQU8sRUFBRUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNTCxHQUFHQSxDQUFDUCxPQUFtQyxFQUFFRSxPQUFxQixFQUFFO0lBQ3BFLE1BQU1XLE1BQU0sR0FBRyxJQUFJQyxxQkFBWSxDQUFDLElBQUksQ0FBQ1gsT0FBTyxDQUFDOztJQUU3QztJQUNBO0lBQ0EsTUFBTVksUUFBa0QsR0FBR0MsTUFBTSxDQUFDQyxhQUFhLElBQUlqQixPQUFPLEdBQUdBLE9BQU8sQ0FBQ2dCLE1BQU0sQ0FBQ0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHakIsT0FBTyxDQUFDZ0IsTUFBTSxDQUFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRXpKLElBQUlHLE1BQU07SUFDVixPQUFPLENBQUMsQ0FBQ0EsTUFBTSxHQUFHLE1BQU1ILFFBQVEsQ0FBQ0ksSUFBSSxDQUFDLENBQUMsRUFBRUMsSUFBSSxFQUFFO01BQzdDUCxNQUFNLENBQUNRLEtBQUssQ0FBQ0gsTUFBTSxDQUFDSSxLQUFLLENBQUM7TUFFMUIsT0FBTyxJQUFJLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQ2xCLE1BQU0sRUFBRTtVQUNsQixNQUFNLElBQUltQixPQUFPLENBQVFDLE9BQU8sSUFBSztZQUNuQyxJQUFJLENBQUNuQixRQUFRLEdBQUdtQixPQUFPO1VBQ3pCLENBQUMsQ0FBQztRQUNKO1FBRUEsTUFBTUMsS0FBSyxHQUFHWixNQUFNLENBQUNhLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUlELEtBQUssS0FBS25CLFNBQVMsRUFBRTtVQUN2QjtRQUNGO1FBRUEsSUFBSSxDQUFDTCxLQUFLLENBQUN3QixLQUFLLENBQUNBLEtBQUssQ0FBQztRQUN2QnZCLE9BQU8sQ0FBQ3VCLEtBQUssQ0FBQ0UsV0FBVyxDQUFDLENBQUNGLEtBQVksQ0FBQztNQUMxQztJQUNGO0lBRUFaLE1BQU0sQ0FBQ2UsR0FBRyxDQUFDLENBQUM7RUFDZDtFQU9BQyxLQUFLQSxDQUFBLEVBQUc7SUFDTixJQUFJLENBQUN6QixNQUFNLEdBQUcsSUFBSTtFQUNwQjtFQUVBMEIsTUFBTUEsQ0FBQSxFQUFHO0lBQ1AsSUFBSSxDQUFDMUIsTUFBTSxHQUFHLEtBQUs7SUFFbkIsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ0EsUUFBUTtJQUM5QixJQUFJLENBQUNBLFFBQVEsR0FBR0MsU0FBUztJQUN6QkQsUUFBUSxHQUFHLENBQUM7RUFDZDtBQUNGO0FBQUMwQixPQUFBLENBQUFsQyxNQUFBLEdBQUFBLE1BQUEiLCJpZ25vcmVMaXN0IjpbXX0=