UNPKG

2.91 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const http2_1 = __importDefault(require("http2"));
7const Engine_1 = require("./Engine");
8class Client {
9 constructor(url) {
10 this.session = http2_1.default.connect(url, {});
11 // necessary to disable Node.js' error handling and us handle the error in .on('error') of the session
12 this.session.on('error', e => { });
13 }
14 close() {
15 this.session.destroy();
16 }
17 request(body) {
18 return new Promise((resolve, reject) => {
19 try {
20 let rejected = false;
21 const buffer = Buffer.from(JSON.stringify(body));
22 const req = this.session.request({
23 [http2_1.default.constants.HTTP2_HEADER_METHOD]: http2_1.default.constants.HTTP2_METHOD_POST,
24 [http2_1.default.constants.HTTP2_HEADER_PATH]: `/`,
25 'Content-Type': 'application/json',
26 'Content-Length': buffer.length,
27 });
28 req.setEncoding('utf8');
29 let data = [];
30 let headers;
31 req.on('error', e => {
32 rejected = true;
33 if (e.code && e.code === 'ECONNREFUSED') {
34 reject(new Error(`Prisma Client could not connect to query engine.`));
35 }
36 else {
37 reject(e);
38 }
39 });
40 req.on('data', chunk => {
41 data.push(chunk);
42 });
43 req.on('response', res => {
44 headers = res;
45 if (res[':status'] === 408) {
46 rejected = true;
47 return reject(new Engine_1.PrismaQueryEngineError(`Timeout in query engine. This is probably related to the database being overwhelmed.`, res[':status']));
48 }
49 if (res[':status'] > 226) {
50 rejected = true;
51 reject(new Engine_1.PrismaQueryEngineError(`Error in query engine response, status code ${res[':status']}${data ? ': ' + data : ''}`, res[':status']));
52 }
53 });
54 if (!rejected) {
55 req.write(buffer);
56 req.end();
57 }
58 req.on('end', () => {
59 if (data && data.length > 0 && !rejected) {
60 resolve({ body: JSON.parse(data.join('')), headers });
61 }
62 });
63 }
64 catch (e) {
65 reject(e);
66 }
67 });
68 }
69}
70exports.Client = Client;
71//# sourceMappingURL=client.js.map
\No newline at end of file