prostgles-server 4.1.143 → 4.1.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import * as pg from "pg";
2
- import QueryStreamType from 'pg-query-stream';
3
2
  import { SQLOptions, SocketSQLStreamServer } from "prostgles-types";
4
3
  import { DB } from "../initProstgles";
5
4
  import { DboBuilder } from "./DboBuilder";
6
5
  import { PRGLIOSocket } from "./DboBuilderTypes";
6
+ import CursorType from 'pg-cursor';
7
7
  type ClientStreamedRequest = {
8
8
  socket: PRGLIOSocket;
9
9
  query: string;
@@ -11,7 +11,7 @@ type ClientStreamedRequest = {
11
11
  persistConnection?: boolean;
12
12
  };
13
13
  type StreamedQuery = ClientStreamedRequest & {
14
- stream: QueryStreamType | undefined;
14
+ cursor: CursorType | undefined;
15
15
  client: pg.Client | undefined;
16
16
  onError: ((error: any) => void);
17
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"QueryStreamer.d.ts","sourceRoot":"","sources":["../../lib/DboBuilder/QueryStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,eAAe,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAY,UAAU,EAAyB,qBAAqB,EAAY,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAE7B,CAAA;AACD,KAAK,aAAa,GAAG,qBAAqB,GAAG;IAC3C,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;CACjC,CAAA;AAYD,qBAAa,aAAa;IACxB,EAAE,EAAE,EAAE,CAAC;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAM;IAClE,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;gBACX,UAAU,EAAE,UAAU;IAelC,aAAa,mBAAoB,GAAG,KAAK,IAAI,8BAA8B,GAAG,YAAY,eAOzF;IAED,YAAY,aAAc,MAAM,UAO/B;IAED,MAAM,UAAiB,qBAAqB,KAAG,QAAQ,qBAAqB,CAAC,CAsK5E;CACF"}
1
+ {"version":3,"file":"QueryStreamer.d.ts","sourceRoot":"","sources":["../../lib/DboBuilder/QueryStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAY,UAAU,EAAyB,qBAAqB,EAAsB,MAAM,iBAAiB,CAAC;AAEzH,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,UAAU,MAAM,WAAW,CAAA;AAGlC,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAA;AACD,KAAK,aAAa,GAAG,qBAAqB,GAAG;IAC3C,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;CACjC,CAAA;AAiBD,qBAAa,aAAa;IACxB,EAAE,EAAE,EAAE,CAAC;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAM;IAClE,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;gBACX,UAAU,EAAE,UAAU;IAelC,aAAa,mBAAoB,GAAG,KAAK,IAAI,8BAA8B,GAAG,YAAY,eAOzF;IAED,YAAY,aAAc,MAAM,UAO/B;IAED,MAAM,UAAiB,qBAAqB,KAAG,QAAQ,qBAAqB,CAAC,CAkK5E;CACF"}
@@ -5,7 +5,7 @@ const pg = require("pg");
5
5
  const prostgles_types_1 = require("prostgles-types");
6
6
  const dboBuilderUtils_1 = require("./dboBuilderUtils");
7
7
  const runSQL_1 = require("./runSQL");
8
- const QueryStream = require('pg-query-stream');
8
+ const Cursor = require('pg-cursor');
9
9
  const shortSocketIds = {};
10
10
  const getSetShortSocketId = (socketId) => {
11
11
  const shortId = socketId.slice(0, 3);
@@ -66,7 +66,7 @@ class QueryStreamer {
66
66
  ...query,
67
67
  id,
68
68
  client: undefined,
69
- stream: undefined,
69
+ cursor: undefined,
70
70
  onError: (rawError) => {
71
71
  if (errored)
72
72
  return;
@@ -85,25 +85,18 @@ class QueryStreamer {
85
85
  if (!socketQuery) {
86
86
  throw "socket query not found";
87
87
  }
88
- let batchRows = [];
89
- let finished = false;
90
- const batchSize = 10000;
91
- let stream;
92
- const emit = (type, streamResult) => {
93
- const ended = type === "ended";
94
- if (finished)
95
- return;
96
- finished = finished || ended;
97
- if (!streamResult?.fields)
88
+ /** Only send fields on first request */
89
+ let fieldsWereSent = false;
90
+ const emit = ({ reachedEnd, rows, info }) => {
91
+ if (!info?.fields)
98
92
  throw "No fields";
99
- const fields = runSQL_1.getDetailedFieldInfo.bind(this.dboBuilder)(streamResult.fields);
100
- const packet = { type: "data", rows: batchRows, fields, info: streamResult, ended, processId: processID };
93
+ const fields = runSQL_1.getDetailedFieldInfo.bind(this.dboBuilder)(info.fields);
94
+ const packet = { type: "data", rows, fields: fieldsWereSent ? undefined : fields, info: reachedEnd ? info : undefined, ended: reachedEnd, processId: processID };
101
95
  socket.emit(channel, packet);
102
- if (ended) {
103
- if (!streamResult)
104
- throw "No result info";
105
- runSQL_1.watchSchemaFallback.bind(this.dboBuilder)({ queryWithoutRLS: query.query, command: streamResult.command });
96
+ if (reachedEnd) {
97
+ runSQL_1.watchSchemaFallback.bind(this.dboBuilder)({ queryWithoutRLS: query.query, command: info.command });
106
98
  }
99
+ fieldsWereSent = true;
107
100
  };
108
101
  const currentClient = client ?? this.getConnection(err => {
109
102
  socketQuery.onError(err);
@@ -115,46 +108,46 @@ class QueryStreamer {
115
108
  await currentClient.connect();
116
109
  }
117
110
  processID = currentClient.processID;
118
- const queryStream = new QueryStream(query.query, undefined, { batchSize: 1e6, highWaterMark: 1e6, rowMode: "array" });
119
- stream = currentClient.query(queryStream);
120
- this.socketQueries[socketId][id].stream = stream;
121
- const getStreamResult = () => (0, prostgles_types_1.omitKeys)(stream._result, ["rows"]);
122
- stream.on('data', async (data) => {
123
- batchRows.push(data);
124
- if (query.options?.streamLimit) {
125
- if (batchRows.length >= query.options.streamLimit) {
126
- emit("ended", getStreamResult());
111
+ if (query.options?.streamLimit && (!Number.isInteger(query.options.streamLimit) || query.options.streamLimit < 0)) {
112
+ throw "streamLimit must be a positive integer";
113
+ }
114
+ const batchSize = query.options?.streamLimit ? Math.min(1e3, query.options?.streamLimit) : 1e3;
115
+ const cursor = currentClient.query(new Cursor(query.query, undefined, { rowMode: "array" }));
116
+ this.socketQueries[socketId][id].cursor = cursor;
117
+ let streamLimitReached = false;
118
+ let reachedEnd = false;
119
+ (async () => {
120
+ try {
121
+ let rowChunk = [];
122
+ let rowsSent = 0;
123
+ do {
124
+ rowChunk = await cursor.read(batchSize);
125
+ const info = (0, prostgles_types_1.pickKeys)(cursor._result, ["fields", "rowCount", "command", "duration"]);
126
+ rowsSent += rowChunk.length;
127
+ streamLimitReached = Boolean(query.options?.streamLimit && rowsSent >= query.options.streamLimit);
128
+ reachedEnd = rowChunk.length < batchSize;
129
+ emit({ info, rows: rowChunk, reachedEnd: reachedEnd || streamLimitReached });
130
+ } while (!reachedEnd && !streamLimitReached);
131
+ streamState = "ended";
132
+ if (!query.options?.persistStreamConnection) {
133
+ delete this.socketQueries[socketId]?.[id];
134
+ currentClient.end();
127
135
  }
128
136
  }
129
- if (batchRows.length >= batchSize) {
130
- emit("rows", getStreamResult());
131
- batchRows = [];
132
- }
133
- });
134
- stream.on('error', error => {
135
- streamState = "errored";
136
- if (error.message === "cannot insert multiple commands into a prepared statement") {
137
- this.dboBuilder.dbo.sql(query.query, {}, { returnType: "arrayMode", hasParams: false }).then(res => {
138
- batchRows.push(res.rows);
139
- emit("ended", res);
140
- }).catch(newError => {
141
- socketQuery.onError(newError);
142
- });
143
- }
144
- else {
145
- socketQuery.onError(error);
146
- }
147
- });
148
- stream.on('end', () => {
149
- const streamResult = getStreamResult();
150
- streamState = "ended";
151
- emit("ended", streamResult);
152
- if (query.options?.persistStreamConnection) {
153
- return;
137
+ catch (error) {
138
+ streamState = "errored";
139
+ if (error.message === "cannot insert multiple commands into a prepared statement") {
140
+ this.dboBuilder.dbo.sql(query.query, {}, { returnType: "arrayMode", hasParams: false }).then(res => {
141
+ emit({ info: (0, prostgles_types_1.omitKeys)(res, ["rows"]), reachedEnd: true, rows: res.rows });
142
+ }).catch(newError => {
143
+ socketQuery.onError(newError);
144
+ });
145
+ }
146
+ else {
147
+ socketQuery.onError(error);
148
+ }
154
149
  }
155
- delete this.socketQueries[socketId]?.[id];
156
- currentClient.end();
157
- });
150
+ })();
158
151
  }
159
152
  catch (err) {
160
153
  socketQuery.onError(err);
@@ -1 +1 @@
1
- {"version":3,"file":"QueryStreamer.js","sourceRoot":"","sources":["../../lib/DboBuilder/QueryStreamer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueryStreamer.js","sourceRoot":"","sources":["../../lib/DboBuilder/QueryStreamer.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,31 @@
1
1
  import * as pg from "pg";
2
- import QueryStreamType from 'pg-query-stream';
3
- import { CHANNELS, SQLOptions, SocketSQLStreamPacket, SocketSQLStreamServer, omitKeys } from "prostgles-types";
2
+ import { CHANNELS, SQLOptions, SocketSQLStreamPacket, SocketSQLStreamServer, omitKeys, pickKeys } from "prostgles-types";
4
3
  import { BasicCallback } from "../PubSubManager/PubSubManager";
5
4
  import { DB } from "../initProstgles";
6
5
  import { DboBuilder } from "./DboBuilder";
7
6
  import { PRGLIOSocket } from "./DboBuilderTypes";
8
7
  import { getErrorAsObject, getSerializedClientErrorFromPGError } from "./dboBuilderUtils";
9
8
  import { getDetailedFieldInfo, watchSchemaFallback } from "./runSQL";
10
- const QueryStream: typeof QueryStreamType = require('pg-query-stream');
11
-
9
+ import CursorType from 'pg-cursor'
10
+ const Cursor: typeof CursorType = require('pg-cursor');
12
11
 
13
12
  type ClientStreamedRequest = {
14
13
  socket: PRGLIOSocket;
15
14
  query: string;
16
15
  options: SQLOptions | undefined;
17
16
  persistConnection?: boolean;
18
-
19
17
  }
20
18
  type StreamedQuery = ClientStreamedRequest & {
21
- stream: QueryStreamType | undefined;
19
+ cursor: CursorType | undefined;
22
20
  client: pg.Client | undefined;
23
21
  onError: ((error: any) => void);
24
22
  }
25
- type Info = { command: string; fields: any[]; rowCount: number; duration: number; }
23
+ type Info = {
24
+ command: string;
25
+ fields: any[];
26
+ rowCount: number;
27
+ duration: number;
28
+ };
26
29
 
27
30
  const shortSocketIds: Record<string, number> = {};
28
31
  const getSetShortSocketId = (socketId: string) => {
@@ -87,7 +90,7 @@ export class QueryStreamer {
87
90
  ...query,
88
91
  id,
89
92
  client: undefined,
90
- stream: undefined,
93
+ cursor: undefined,
91
94
  onError: (rawError: any) => {
92
95
  if(errored) return;
93
96
  errored = true;
@@ -108,22 +111,17 @@ export class QueryStreamer {
108
111
  throw "socket query not found";
109
112
  }
110
113
 
111
- let batchRows: any[] = [];
112
- let finished = false;
113
- const batchSize = 10000;
114
- let stream: QueryStreamType;
115
- const emit = (type: "rows" | "ended", streamResult: Info | undefined) => {
116
- const ended = type === "ended";
117
- if(finished) return;
118
- finished = finished || ended;
119
- if(!streamResult?.fields) throw "No fields";
120
- const fields = getDetailedFieldInfo.bind(this.dboBuilder)(streamResult.fields as any);
121
- const packet: SocketSQLStreamPacket = { type: "data", rows: batchRows, fields, info: streamResult, ended, processId: processID };
114
+ /** Only send fields on first request */
115
+ let fieldsWereSent = false;
116
+ const emit = ({ reachedEnd, rows, info }: { reachedEnd: true; rows: any[]; info: Info } | { reachedEnd: false; rows: any[]; info: Omit<Info, "command"> }) => {
117
+ if(!info?.fields) throw "No fields";
118
+ const fields = getDetailedFieldInfo.bind(this.dboBuilder)(info.fields as any);
119
+ const packet: SocketSQLStreamPacket = { type: "data", rows, fields: fieldsWereSent? undefined : fields, info: reachedEnd? info : undefined, ended: reachedEnd, processId: processID };
122
120
  socket.emit(channel, packet);
123
- if(ended){
124
- if(!streamResult) throw "No result info";
125
- watchSchemaFallback.bind(this.dboBuilder)({ queryWithoutRLS: query.query, command: streamResult.command });
121
+ if(reachedEnd){
122
+ watchSchemaFallback.bind(this.dboBuilder)({ queryWithoutRLS: query.query, command: info.command });
126
123
  }
124
+ fieldsWereSent = true;
127
125
  }
128
126
  const currentClient = client ?? this.getConnection(err => {
129
127
  socketQuery.onError(err);
@@ -134,47 +132,48 @@ export class QueryStreamer {
134
132
  if(!client){
135
133
  await currentClient.connect();
136
134
  }
137
- processID = (currentClient as any).processID
138
- const queryStream = new QueryStream(query.query, undefined, { batchSize: 1e6, highWaterMark: 1e6, rowMode: "array" });
139
- stream = currentClient.query(queryStream);
140
- this.socketQueries[socketId]![id]!.stream = stream;
141
- const getStreamResult = () => omitKeys(stream._result, ["rows"]) as Info;
142
- stream.on('data', async (data) => {
143
- batchRows.push(data);
144
- if(query.options?.streamLimit) {
145
- if(batchRows.length >= query.options.streamLimit){
146
- emit("ended", getStreamResult());
135
+ processID = (currentClient as any).processID;
136
+
137
+ if(query.options?.streamLimit && (!Number.isInteger(query.options.streamLimit) || query.options.streamLimit < 0)){
138
+ throw "streamLimit must be a positive integer";
139
+ }
140
+ const batchSize = query.options?.streamLimit? Math.min(1e3, query.options?.streamLimit) : 1e3;
141
+ const cursor = currentClient.query(new Cursor(query.query, undefined, { rowMode: "array" }));
142
+ this.socketQueries[socketId]![id]!.cursor = cursor;
143
+ let streamLimitReached = false;
144
+ let reachedEnd = false;
145
+ (async () => {
146
+ try {
147
+ let rowChunk: any[] = [];
148
+ let rowsSent = 0;
149
+ do {
150
+ rowChunk = await cursor.read(batchSize);
151
+ const info = pickKeys((cursor as any)._result, ["fields", "rowCount", "command", "duration"]) as Info;
152
+ rowsSent += rowChunk.length;
153
+ streamLimitReached = Boolean(query.options?.streamLimit && rowsSent >= query.options.streamLimit);
154
+ reachedEnd = rowChunk.length < batchSize;
155
+ emit({ info, rows: rowChunk, reachedEnd: reachedEnd || streamLimitReached });
156
+ } while (!reachedEnd && !streamLimitReached);
157
+
158
+ streamState = "ended";
159
+
160
+ if(!query.options?.persistStreamConnection){
161
+ delete this.socketQueries[socketId]?.[id];
162
+ currentClient.end();
163
+ }
164
+ } catch(error: any){
165
+ streamState = "errored";
166
+ if(error.message === "cannot insert multiple commands into a prepared statement") {
167
+ this.dboBuilder.dbo.sql!(query.query, {}, { returnType: "arrayMode", hasParams: false }).then(res => {
168
+ emit({ info: omitKeys(res, ["rows"]), reachedEnd: true, rows: res.rows});
169
+ }).catch(newError => {
170
+ socketQuery.onError(newError);
171
+ });
172
+ } else {
173
+ socketQuery.onError(error);
147
174
  }
148
- }
149
- if (batchRows.length >= batchSize) {
150
- emit("rows", getStreamResult());
151
- batchRows = [];
152
- }
153
- });
154
- stream.on('error', error => {
155
- streamState = "errored";
156
- if(error.message === "cannot insert multiple commands into a prepared statement") {
157
- this.dboBuilder.dbo.sql!(query.query, {}, { returnType: "arrayMode", hasParams: false }).then(res => {
158
- batchRows.push(res.rows);
159
- emit("ended", res);
160
- }).catch(newError => {
161
- socketQuery.onError(newError);
162
- });
163
- } else {
164
- socketQuery.onError(error);
165
- }
166
- });
167
- stream.on('end', () => {
168
- const streamResult = getStreamResult();
169
- streamState = "ended";
170
- emit("ended", streamResult);
171
-
172
- if(query.options?.persistStreamConnection){
173
- return;
174
- }
175
- delete this.socketQueries[socketId]?.[id];
176
- currentClient.end();
177
- });
175
+ }
176
+ })()
178
177
  } catch(err){
179
178
  socketQuery.onError(err);
180
179
  await currentClient.end();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.1.143",
3
+ "version": "4.1.145",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -43,8 +43,8 @@
43
43
  "check-disk-space": "^3.3.1",
44
44
  "file-type": "^18.5.0",
45
45
  "pg": "^8.11.3",
46
+ "pg-cursor": "^2.10.3",
46
47
  "pg-promise": "^11.5.4",
47
- "pg-query-stream": "^4.5.3",
48
48
  "prostgles-client": "^4.0.53",
49
49
  "prostgles-types": "^4.0.67"
50
50
  },
@@ -52,6 +52,7 @@
52
52
  "@types/bluebird": "^3.5.36",
53
53
  "@types/file-type": "^10.9.1",
54
54
  "@types/node": "^18.0.3",
55
+ "@types/pg-cursor": "^2.7.2",
55
56
  "@types/sharp": "^0.30.4",
56
57
  "@types/socket.io": "^3.0.2",
57
58
  "@typescript-eslint/eslint-plugin": "^5.62.0",
@@ -7,7 +7,7 @@
7
7
  "start": "tsc-watch --onSuccess \"node dist/client/index.js\"",
8
8
  "dev": "NOSTOP=true npm start",
9
9
  "build": "rm -rf ./node_modules/* && rm -rf ./dist/* && npm i && tsc",
10
- "test": "node dist/client/index.js"
10
+ "test": "node dist/client/index.js"
11
11
  },
12
12
  "author": "",
13
13
  "license": "ISC",
@@ -6,8 +6,33 @@ import { reject } from 'bluebird';
6
6
 
7
7
  export default async function client_only(db: DBHandlerClient, auth: Auth, log: (...args: any[]) => any, methods, tableSchema: DBSchemaTable[], token: string){
8
8
 
9
+ await tryRunP("SQL Stream ensure the connection is never released (same pg_backend_pid is the same for subsequent) when using persistConnectionId", async (resolve, reject) => {
10
+ const query = "SELECT pg_backend_pid()";
11
+ const res = await db.sql!(query, {}, { returnType: "stream", persistStreamConnection: true });
12
+ const pids: number[] = [];
13
+ const listener = async (packet: SocketSQLStreamPacket) => {
14
+ if(packet.type === "error"){
15
+ reject(packet.error);
16
+ } else {
17
+ assert.equal(packet.type, "data");
18
+ assert.equal(packet.ended, true);
19
+ assert.equal(packet.rows.length, 1);
20
+ const pid = packet.rows[0][0];
21
+ pids.push(pid);
22
+ if(pids.length === 1){
23
+ startHandler.run(query).catch(reject);
24
+ }
25
+ if(pids.length === 2){
26
+ assert.equal(pids[0], pids[1]);
27
+ resolve("ok");
28
+ }
29
+ }
30
+ };
31
+ const startHandler = await res.start(listener);
32
+ });
33
+
9
34
  await tryRunP("SQL Stream stop kills the query", async (resolve, reject) => {
10
- const query = "SELECT * FROM pg_sleep(5)"
35
+ const query = "SELECT * FROM pg_sleep(5)";
11
36
  const res = await db.sql!(query, {}, { returnType: "stream" });
12
37
  const listener = async (packet: SocketSQLStreamPacket) => {
13
38
  if(packet.type === "error"){
@@ -19,8 +44,8 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
19
44
  } else {
20
45
  assert.equal(packet.type, "data");
21
46
  assert.equal(packet.ended, true);
22
- assert.deepStrictEqual(packet.rows, []);
23
- reject("ok");
47
+ assert.deepStrictEqual(packet.rows, [['']]);
48
+ reject("SQL Stream stop kills the query");
24
49
  }
25
50
  };
26
51
  const startHandler = await res.start(listener);
@@ -29,6 +54,21 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
29
54
  }, 1000);
30
55
  });
31
56
 
57
+ await tryRunP("SQL Stream limit works", async (resolve, reject) => {
58
+ const res = await db.sql!("SELECT * FROM generate_series(1, 1e5)", {}, { returnType: "stream", streamLimit: 10 });
59
+ const listener = async (packet: SocketSQLStreamPacket) => {
60
+ if(packet.type === "error"){
61
+ reject(packet.error);
62
+ } else {
63
+ assert.equal(packet.type, "data");
64
+ assert.equal(packet.ended, true);
65
+ assert.equal(packet.rows.length, 10);
66
+ resolve("ok");
67
+ }
68
+ };
69
+ await res.start(listener);
70
+ });
71
+
32
72
  await tryRunP("SQL Stream stop with terminate kills the query", async (resolve, reject) => {
33
73
  const totalRows = 5e6;
34
74
  const query = `SELECT * FROM generate_series(1, ${totalRows})`;
@@ -181,31 +221,6 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
181
221
  await res.start(listener);
182
222
  });
183
223
 
184
- // await tryRunP("SQL Stream ensure the connection is never released (same pg_backend_pid is the same for subsequent) queries when using persistConnectionId", async (resolve, reject) => {
185
- // const query = "SELECT pg_backend_pid()";
186
- // const res = await db.sql!(query, {}, { returnType: "stream", persistConnectionId: true });
187
- // const pids: number[] = [];
188
- // const listener = async (packet: SocketSQLStreamPacket) => {
189
- // if(packet.type === "error"){
190
- // reject(packet.error);
191
- // } else {
192
- // assert.equal(packet.type, "data");
193
- // assert.equal(packet.ended, true);
194
- // assert.equal(packet.rows.length, 1);
195
- // const pid = packet.rows[0].pg_backend_pid;
196
- // pids.push(pid);
197
- // if(pids.length === 1){
198
- // startHandler.run(query)
199
- // }
200
- // if(pids.length === 2){
201
- // assert.equal(pids[0], pids[1]);
202
- // resolve("ok");
203
- // }
204
- // }
205
- // };
206
- // const startHandler = await res.start(listener);
207
- // });
208
-
209
224
 
210
225
  /**
211
226
  * tableSchema must contan an array of all tables and their columns that have getInfo and getColumns allowed
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "../..": {
23
23
  "name": "prostgles-server",
24
- "version": "4.1.142",
24
+ "version": "4.1.144",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
27
  "@types/express": "^4.17.13",
@@ -32,8 +32,8 @@
32
32
  "check-disk-space": "^3.3.1",
33
33
  "file-type": "^18.5.0",
34
34
  "pg": "^8.11.3",
35
+ "pg-cursor": "^2.10.3",
35
36
  "pg-promise": "^11.5.4",
36
- "pg-query-stream": "^4.5.3",
37
37
  "prostgles-client": "^4.0.53",
38
38
  "prostgles-types": "^4.0.67"
39
39
  },
@@ -41,6 +41,7 @@
41
41
  "@types/bluebird": "^3.5.36",
42
42
  "@types/file-type": "^10.9.1",
43
43
  "@types/node": "^18.0.3",
44
+ "@types/pg-cursor": "^2.7.2",
44
45
  "@types/sharp": "^0.30.4",
45
46
  "@types/socket.io": "^3.0.2",
46
47
  "@typescript-eslint/eslint-plugin": "^5.62.0",
@@ -1533,6 +1534,7 @@
1533
1534
  "@types/json-schema": "^7.0.11",
1534
1535
  "@types/node": "^18.0.3",
1535
1536
  "@types/pg": "^8.10.9",
1537
+ "@types/pg-cursor": "^2.7.2",
1536
1538
  "@types/sharp": "^0.30.4",
1537
1539
  "@types/socket.io": "^3.0.2",
1538
1540
  "@typescript-eslint/eslint-plugin": "^5.62.0",
@@ -1543,8 +1545,8 @@
1543
1545
  "eslint": "^8.51.0",
1544
1546
  "file-type": "^18.5.0",
1545
1547
  "pg": "^8.11.3",
1548
+ "pg-cursor": "^2.10.3",
1546
1549
  "pg-promise": "^11.5.4",
1547
- "pg-query-stream": "^4.5.3",
1548
1550
  "prostgles-client": "^4.0.53",
1549
1551
  "prostgles-types": "^4.0.67",
1550
1552
  "typescript": "^5.2.2"