@powersync/service-jpgwire 0.18.5 → 0.20.0
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.
- package/dist/pgwire_node.js +3 -137
- package/dist/pgwire_node.js.map +1 -1
- package/dist/pgwire_types.d.ts +21 -8
- package/dist/pgwire_types.js +121 -177
- package/dist/pgwire_types.js.map +1 -1
- package/dist/socket_adapter.d.ts +24 -0
- package/dist/socket_adapter.js +140 -0
- package/dist/socket_adapter.js.map +1 -0
- package/dist/util.d.ts +14 -11
- package/dist/util.js +17 -10
- package/dist/util.js.map +1 -1
- package/package.json +2 -4
package/dist/pgwire_node.js
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
// Fork of pgwire/index.js, customized to handle additional TLS options
|
|
2
2
|
// Based on the version in commit 9532a395d6fa03a59c2231f0ec690806c90bd338
|
|
3
3
|
// Modifications marked with `START POWERSYNC ...`
|
|
4
|
-
import net from 'net';
|
|
5
|
-
import tls from 'tls';
|
|
6
4
|
import { createHash, pbkdf2 as _pbkdf2, randomFillSync } from 'crypto';
|
|
7
|
-
import { once } from 'events';
|
|
8
5
|
import { promisify } from 'util';
|
|
9
6
|
import { _net, SaslScramSha256 } from 'pgwire/mod.js';
|
|
10
|
-
import {
|
|
11
|
-
// START POWERSYNC
|
|
12
|
-
// pgwire doesn't natively support configuring timeouts, but we just hardcode a default.
|
|
13
|
-
// Timeout idle connections after 6 minutes (we ping at least every 5 minutes).
|
|
14
|
-
const POWERSYNC_SOCKET_DEFAULT_TIMEOUT = 360000;
|
|
15
|
-
// Timeout for the initial connection (pre-TLS)
|
|
16
|
-
// Must be less than the timeout for a HTTP request
|
|
17
|
-
const POWERSYNC_SOCKET_CONNECT_TIMEOUT = 20000;
|
|
18
|
-
// TCP keepalive delay in milliseconds.
|
|
19
|
-
// This can help detect dead connections earlier.
|
|
20
|
-
const POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY = 40000;
|
|
21
|
-
// END POWERSYNC
|
|
7
|
+
import { SocketAdapter } from './socket_adapter.js';
|
|
22
8
|
const pbkdf2 = promisify(_pbkdf2);
|
|
23
9
|
Object.assign(SaslScramSha256.prototype, {
|
|
24
10
|
_b64encode(bytes) {
|
|
@@ -39,8 +25,8 @@ Object.assign(SaslScramSha256.prototype, {
|
|
|
39
25
|
}
|
|
40
26
|
});
|
|
41
27
|
Object.assign(_net, {
|
|
42
|
-
connect(
|
|
43
|
-
return SocketAdapter.connect(
|
|
28
|
+
connect(options) {
|
|
29
|
+
return SocketAdapter.connect(options);
|
|
44
30
|
},
|
|
45
31
|
reconnectable(err) {
|
|
46
32
|
return ['ENOTFOUND', 'ECONNREFUSED', 'ECONNRESET'].includes(err?.code);
|
|
@@ -60,124 +46,4 @@ Object.assign(_net, {
|
|
|
60
46
|
return sockadapt.close();
|
|
61
47
|
}
|
|
62
48
|
});
|
|
63
|
-
class SocketAdapter {
|
|
64
|
-
static async connect(host, port) {
|
|
65
|
-
// START POWERSYNC
|
|
66
|
-
// Custom timeout handling
|
|
67
|
-
const socket = net.connect({
|
|
68
|
-
host,
|
|
69
|
-
port,
|
|
70
|
-
// This closes the connection if no data was sent or received for the given time,
|
|
71
|
-
// even if the connection is still actaully alive.
|
|
72
|
-
timeout: POWERSYNC_SOCKET_DEFAULT_TIMEOUT,
|
|
73
|
-
// This configures TCP keepalive.
|
|
74
|
-
keepAlive: true,
|
|
75
|
-
keepAliveInitialDelay: POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY
|
|
76
|
-
// Unfortunately it is not possible to set tcp_keepalive_intvl or
|
|
77
|
-
// tcp_keepalive_probes here.
|
|
78
|
-
});
|
|
79
|
-
try {
|
|
80
|
-
const timeout = setTimeout(() => {
|
|
81
|
-
socket.destroy(new Error(`Timeout while connecting to ${host}:${port}`));
|
|
82
|
-
}, POWERSYNC_SOCKET_CONNECT_TIMEOUT);
|
|
83
|
-
await once(socket, 'connect');
|
|
84
|
-
clearTimeout(timeout);
|
|
85
|
-
return new this(socket);
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
socket.destroy();
|
|
89
|
-
throw e;
|
|
90
|
-
}
|
|
91
|
-
// END POWERSYNC
|
|
92
|
-
}
|
|
93
|
-
constructor(socket) {
|
|
94
|
-
this._readResume = Boolean; // noop
|
|
95
|
-
this._writeResume = Boolean; // noop
|
|
96
|
-
this._readPauseAsync = (resolve) => (this._readResume = resolve);
|
|
97
|
-
this._writePauseAsync = (resolve) => (this._writeResume = resolve);
|
|
98
|
-
this._error = null;
|
|
99
|
-
/** @type {net.Socket} */
|
|
100
|
-
this._socket = socket;
|
|
101
|
-
this._socket.on('readable', (_) => this._readResume());
|
|
102
|
-
this._socket.on('end', (_) => this._readResume());
|
|
103
|
-
// START POWERSYNC
|
|
104
|
-
// Custom timeout handling
|
|
105
|
-
this._socket.on('timeout', (_) => {
|
|
106
|
-
this._socket.destroy(new Error('Socket idle timeout'));
|
|
107
|
-
});
|
|
108
|
-
// END POWERSYNC
|
|
109
|
-
this._socket.on('error', (error) => {
|
|
110
|
-
this._error = error;
|
|
111
|
-
this._readResume();
|
|
112
|
-
this._writeResume();
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
// START POWERSYNC CUSTOM TIMEOUT
|
|
116
|
-
setTimeout(timeout) {
|
|
117
|
-
this._socket.setTimeout(timeout);
|
|
118
|
-
}
|
|
119
|
-
// END POWERSYNC CUSTOM TIMEOUT
|
|
120
|
-
async startTls(host, ca) {
|
|
121
|
-
// START POWERSYNC CUSTOM OPTIONS HANDLING
|
|
122
|
-
if (!Array.isArray(ca) && typeof ca[0] == 'object') {
|
|
123
|
-
throw new Error('Invalid PowerSync TLS options');
|
|
124
|
-
}
|
|
125
|
-
const tlsOptions = ca[0];
|
|
126
|
-
// https://nodejs.org/docs/latest-v14.x/api/tls.html#tls_tls_connect_options_callback
|
|
127
|
-
const socket = this._socket;
|
|
128
|
-
const tlsSocket = tls.connect({ socket, host, ...tlsOptions });
|
|
129
|
-
// END POWERSYNC CUSTOM OPTIONS HANDLING
|
|
130
|
-
await once(tlsSocket, 'secureConnect');
|
|
131
|
-
// TODO check tlsSocket.authorized
|
|
132
|
-
// if secure connection succeeded then we take underlying socket ownership,
|
|
133
|
-
// otherwise underlying socket should be closed outside.
|
|
134
|
-
tlsSocket.on('close', (_) => socket.destroy());
|
|
135
|
-
return new this.constructor(tlsSocket);
|
|
136
|
-
}
|
|
137
|
-
/** @param {Uint8Array} out */
|
|
138
|
-
async read(out) {
|
|
139
|
-
let buf;
|
|
140
|
-
for (;;) {
|
|
141
|
-
if (this._error)
|
|
142
|
-
throw this._error; // TODO callstack
|
|
143
|
-
if (this._socket.readableEnded)
|
|
144
|
-
return null;
|
|
145
|
-
// POWERSYNC FIX: Read only as much data as available, instead of reading everything and
|
|
146
|
-
// unshifting back onto the socket
|
|
147
|
-
const toRead = Math.min(out.length, this._socket.readableLength);
|
|
148
|
-
buf = this._socket.read(toRead);
|
|
149
|
-
if (buf?.length)
|
|
150
|
-
break;
|
|
151
|
-
if (!buf)
|
|
152
|
-
await new Promise(this._readPauseAsync);
|
|
153
|
-
}
|
|
154
|
-
if (buf.length > out.length) {
|
|
155
|
-
throw new Error('Read more data than expected');
|
|
156
|
-
}
|
|
157
|
-
out.set(buf);
|
|
158
|
-
// POWERSYNC: Add metrics
|
|
159
|
-
recordBytesRead(buf.length);
|
|
160
|
-
return buf.length;
|
|
161
|
-
}
|
|
162
|
-
async write(data) {
|
|
163
|
-
// TODO assert Uint8Array
|
|
164
|
-
// TODO need to copy data?
|
|
165
|
-
if (this._error)
|
|
166
|
-
throw this._error; // TODO callstack
|
|
167
|
-
const p = new Promise(this._writePauseAsync);
|
|
168
|
-
this._socket.write(data, this._writeResume);
|
|
169
|
-
await p;
|
|
170
|
-
if (this._error)
|
|
171
|
-
throw this._error; // TODO callstack
|
|
172
|
-
return data.length;
|
|
173
|
-
}
|
|
174
|
-
// async closeWrite() {
|
|
175
|
-
// if (this._error) throw this._error; // TODO callstack
|
|
176
|
-
// const socket_end = promisify(cb => this._socket.end(cb));
|
|
177
|
-
// await socket_end();
|
|
178
|
-
// }
|
|
179
|
-
close() {
|
|
180
|
-
this._socket.destroy(Error('socket destroyed'));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
49
|
//# sourceMappingURL=pgwire_node.js.map
|
package/dist/pgwire_node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgwire_node.js","sourceRoot":"","sources":["../src/pgwire_node.js"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0EAA0E;AAC1E,kDAAkD;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"pgwire_node.js","sourceRoot":"","sources":["../src/pgwire_node.js"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0EAA0E;AAC1E,kDAAkD;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;IACvC,UAAU,CAAC,KAAK;QACd,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,UAAU,CAAC,GAAG;QACZ,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,YAAY,CAAC,CAAC;QACZ,OAAO,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,GAAG;QACb,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU;QAC7B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;IAClB,OAAO,CAAC,OAAO;QACb,OAAO,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,aAAa,CAAC,GAAG;QACf,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IACD,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;QACvC,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,GAAG;QACjB,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK,CAAC,SAAS,EAAE,IAAI;QACnB,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,aAAa,CAAC,SAAS;QACrB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
package/dist/pgwire_types.d.ts
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare enum PgTypeOid {
|
|
2
|
+
TEXT = 25,
|
|
3
|
+
UUID = 2950,
|
|
4
|
+
VARCHAR = 1043,
|
|
5
|
+
BOOL = 16,
|
|
6
|
+
BYTEA = 17,
|
|
7
|
+
INT2 = 21,
|
|
8
|
+
INT4 = 23,
|
|
9
|
+
OID = 26,
|
|
10
|
+
INT8 = 20,
|
|
11
|
+
FLOAT4 = 700,
|
|
12
|
+
FLOAT8 = 701,
|
|
13
|
+
DATE = 1082,
|
|
14
|
+
TIMESTAMP = 1114,
|
|
15
|
+
TIMESTAMPTZ = 1184,
|
|
16
|
+
JSON = 114,
|
|
17
|
+
JSONB = 3802,
|
|
18
|
+
PG_LSN = 3220
|
|
19
|
+
}
|
|
3
20
|
export declare class PgType {
|
|
21
|
+
static getArrayType(typeOid: number): number | undefined;
|
|
4
22
|
static decode(text: string, typeOid: number): any;
|
|
5
|
-
static _elemTypeOid(arrayTypeOid: number):
|
|
23
|
+
static _elemTypeOid(arrayTypeOid: number): number | undefined;
|
|
6
24
|
static _decodeArray(text: string, elemTypeOid: number): any;
|
|
7
25
|
static _decodeBytea(text: string): Uint8Array;
|
|
8
26
|
static _encodeBytea(bytes: Uint8Array): string;
|
|
9
27
|
}
|
|
10
|
-
/**
|
|
11
|
-
* We need a high level of control over how values are decoded, to make sure there is no loss
|
|
12
|
-
* of precision in the process.
|
|
13
|
-
*/
|
|
14
|
-
export declare function decodeTuple(relation: PgoutputRelation, tupleRaw: Record<string, any>): DatabaseInputRow;
|
package/dist/pgwire_types.js
CHANGED
|
@@ -1,184 +1,146 @@
|
|
|
1
1
|
// Adapted from https://github.com/kagis/pgwire/blob/0dc927f9f8990a903f238737326e53ba1c8d094f/mod.js#L2218
|
|
2
|
-
import { dateToSqlite, lsnMakeComparable, timestampToSqlite, timestamptzToSqlite } from './util.js';
|
|
3
2
|
import { JsonContainer } from '@powersync/service-jsonbig';
|
|
3
|
+
import { dateToSqlite, lsnMakeComparable, timestampToSqlite, timestamptzToSqlite } from './util.js';
|
|
4
|
+
export var PgTypeOid;
|
|
5
|
+
(function (PgTypeOid) {
|
|
6
|
+
PgTypeOid[PgTypeOid["TEXT"] = 25] = "TEXT";
|
|
7
|
+
PgTypeOid[PgTypeOid["UUID"] = 2950] = "UUID";
|
|
8
|
+
PgTypeOid[PgTypeOid["VARCHAR"] = 1043] = "VARCHAR";
|
|
9
|
+
PgTypeOid[PgTypeOid["BOOL"] = 16] = "BOOL";
|
|
10
|
+
PgTypeOid[PgTypeOid["BYTEA"] = 17] = "BYTEA";
|
|
11
|
+
PgTypeOid[PgTypeOid["INT2"] = 21] = "INT2";
|
|
12
|
+
PgTypeOid[PgTypeOid["INT4"] = 23] = "INT4";
|
|
13
|
+
PgTypeOid[PgTypeOid["OID"] = 26] = "OID";
|
|
14
|
+
PgTypeOid[PgTypeOid["INT8"] = 20] = "INT8";
|
|
15
|
+
PgTypeOid[PgTypeOid["FLOAT4"] = 700] = "FLOAT4";
|
|
16
|
+
PgTypeOid[PgTypeOid["FLOAT8"] = 701] = "FLOAT8";
|
|
17
|
+
PgTypeOid[PgTypeOid["DATE"] = 1082] = "DATE";
|
|
18
|
+
PgTypeOid[PgTypeOid["TIMESTAMP"] = 1114] = "TIMESTAMP";
|
|
19
|
+
PgTypeOid[PgTypeOid["TIMESTAMPTZ"] = 1184] = "TIMESTAMPTZ";
|
|
20
|
+
PgTypeOid[PgTypeOid["JSON"] = 114] = "JSON";
|
|
21
|
+
PgTypeOid[PgTypeOid["JSONB"] = 3802] = "JSONB";
|
|
22
|
+
PgTypeOid[PgTypeOid["PG_LSN"] = 3220] = "PG_LSN";
|
|
23
|
+
})(PgTypeOid || (PgTypeOid = {}));
|
|
24
|
+
// Generate using:
|
|
25
|
+
// select '[' || typarray || ', ' || oid || '], // ' || typname from pg_catalog.pg_type WHERE typarray != 0;
|
|
26
|
+
const ARRAY_TO_ELEM_OID = new Map([
|
|
27
|
+
[1000, 16], // bool
|
|
28
|
+
[1001, 17], // bytea
|
|
29
|
+
[1002, 18], // char
|
|
30
|
+
[1003, 19], // name
|
|
31
|
+
[1016, 20], // int8
|
|
32
|
+
[1005, 21], // int2
|
|
33
|
+
[1006, 22], // int2vector
|
|
34
|
+
[1007, 23], // int4
|
|
35
|
+
[1008, 24], // regproc
|
|
36
|
+
[1009, 25], // text
|
|
37
|
+
[1028, 26], // oid
|
|
38
|
+
[1010, 27], // tid
|
|
39
|
+
[1011, 28], // xid
|
|
40
|
+
[1012, 29], // cid
|
|
41
|
+
[1013, 30], // oidvector
|
|
42
|
+
[210, 71], // pg_type
|
|
43
|
+
[270, 75], // pg_attribute
|
|
44
|
+
[272, 81], // pg_proc
|
|
45
|
+
[273, 83], // pg_class
|
|
46
|
+
[199, 114], // json
|
|
47
|
+
[143, 142], // xml
|
|
48
|
+
[271, 5069], // xid8
|
|
49
|
+
[1017, 600], // point
|
|
50
|
+
[1018, 601], // lseg
|
|
51
|
+
[1019, 602], // path
|
|
52
|
+
[1020, 603], // box
|
|
53
|
+
[1027, 604], // polygon
|
|
54
|
+
[629, 628], // line
|
|
55
|
+
[1021, 700], // float4
|
|
56
|
+
[1022, 701], // float8
|
|
57
|
+
[0, 705], // unknown
|
|
58
|
+
[719, 718], // circle
|
|
59
|
+
[791, 790], // money
|
|
60
|
+
[1040, 829], // macaddr
|
|
61
|
+
[1041, 869], // inet
|
|
62
|
+
[651, 650], // cidr
|
|
63
|
+
[775, 774], // macaddr8
|
|
64
|
+
[1034, 1033], // aclitem
|
|
65
|
+
[1014, 1042], // bpchar
|
|
66
|
+
[1015, 1043], // varchar
|
|
67
|
+
[1182, 1082], // date
|
|
68
|
+
[1183, 1083], // time
|
|
69
|
+
[1115, 1114], // timestamp
|
|
70
|
+
[1185, 1184], // timestamptz
|
|
71
|
+
[1187, 1186], // interval
|
|
72
|
+
[1270, 1266], // timetz
|
|
73
|
+
[1561, 1560], // bit
|
|
74
|
+
[1563, 1562], // varbit
|
|
75
|
+
[1231, 1700], // numeric
|
|
76
|
+
[2201, 1790], // refcursor
|
|
77
|
+
[2207, 2202], // regprocedure
|
|
78
|
+
[2208, 2203], // regoper
|
|
79
|
+
[2209, 2204], // regoperator
|
|
80
|
+
[2210, 2205], // regclass
|
|
81
|
+
[4192, 4191], // regcollation
|
|
82
|
+
[2211, 2206], // regtype
|
|
83
|
+
[4097, 4096], // regrole
|
|
84
|
+
[4090, 4089], // regnamespace
|
|
85
|
+
[2951, 2950], // uuid
|
|
86
|
+
[3221, 3220], // pg_lsn
|
|
87
|
+
[3643, 3614], // tsvector
|
|
88
|
+
[3644, 3642], // gtsvector
|
|
89
|
+
[3645, 3615], // tsquery
|
|
90
|
+
[3735, 3734], // regconfig
|
|
91
|
+
[3770, 3769], // regdictionary
|
|
92
|
+
[3807, 3802], // jsonb
|
|
93
|
+
[4073, 4072] // jsonpath
|
|
94
|
+
]);
|
|
95
|
+
const ELEM_OID_TO_ARRAY = new Map();
|
|
96
|
+
ARRAY_TO_ELEM_OID.forEach((value, key) => {
|
|
97
|
+
ELEM_OID_TO_ARRAY.set(value, key);
|
|
98
|
+
});
|
|
4
99
|
export class PgType {
|
|
100
|
+
static getArrayType(typeOid) {
|
|
101
|
+
return ELEM_OID_TO_ARRAY.get(typeOid);
|
|
102
|
+
}
|
|
5
103
|
static decode(text, typeOid) {
|
|
6
|
-
switch (typeOid
|
|
7
|
-
|
|
8
|
-
case
|
|
9
|
-
case
|
|
10
|
-
case
|
|
104
|
+
switch (typeOid) {
|
|
105
|
+
// add line here when register new type
|
|
106
|
+
case PgTypeOid.TEXT:
|
|
107
|
+
case PgTypeOid.UUID:
|
|
108
|
+
case PgTypeOid.VARCHAR:
|
|
11
109
|
return text;
|
|
12
|
-
case
|
|
110
|
+
case PgTypeOid.BOOL:
|
|
13
111
|
return text == 't';
|
|
14
|
-
case
|
|
112
|
+
case PgTypeOid.BYTEA:
|
|
15
113
|
return this._decodeBytea(text);
|
|
16
|
-
case
|
|
17
|
-
case
|
|
18
|
-
case
|
|
19
|
-
case
|
|
114
|
+
case PgTypeOid.INT2:
|
|
115
|
+
case PgTypeOid.INT4:
|
|
116
|
+
case PgTypeOid.OID:
|
|
117
|
+
case PgTypeOid.INT8:
|
|
20
118
|
return BigInt(text);
|
|
21
|
-
case
|
|
22
|
-
case
|
|
119
|
+
case PgTypeOid.FLOAT4:
|
|
120
|
+
case PgTypeOid.FLOAT8:
|
|
23
121
|
return Number(text);
|
|
24
|
-
case
|
|
122
|
+
case PgTypeOid.DATE:
|
|
25
123
|
return dateToSqlite(text);
|
|
26
|
-
case
|
|
124
|
+
case PgTypeOid.TIMESTAMP:
|
|
27
125
|
return timestampToSqlite(text);
|
|
28
|
-
case
|
|
126
|
+
case PgTypeOid.TIMESTAMPTZ:
|
|
29
127
|
return timestamptzToSqlite(text);
|
|
30
|
-
case
|
|
31
|
-
case
|
|
128
|
+
case PgTypeOid.JSON:
|
|
129
|
+
case PgTypeOid.JSONB:
|
|
32
130
|
// Don't parse the contents
|
|
33
131
|
return new JsonContainer(text);
|
|
34
|
-
case
|
|
132
|
+
case PgTypeOid.PG_LSN:
|
|
35
133
|
return lsnMakeComparable(text);
|
|
36
134
|
}
|
|
37
135
|
const elemTypeid = this._elemTypeOid(typeOid);
|
|
38
|
-
if (elemTypeid) {
|
|
136
|
+
if (elemTypeid != null) {
|
|
39
137
|
return this._decodeArray(text, elemTypeid);
|
|
40
138
|
}
|
|
41
139
|
return text; // unknown type
|
|
42
140
|
}
|
|
43
141
|
static _elemTypeOid(arrayTypeOid) {
|
|
44
|
-
// select 'case ' || typarray || ': return ' || oid || '; // ' || typname from pg_catalog.pg_type WHERE
|
|
45
|
-
|
|
46
|
-
) {
|
|
47
|
-
case 1000:
|
|
48
|
-
return 16; // bool
|
|
49
|
-
case 1001:
|
|
50
|
-
return 17; // bytea
|
|
51
|
-
case 1002:
|
|
52
|
-
return 18; // char
|
|
53
|
-
case 1003:
|
|
54
|
-
return 19; // name
|
|
55
|
-
case 1016:
|
|
56
|
-
return 20; // int8
|
|
57
|
-
case 1005:
|
|
58
|
-
return 21; // int2
|
|
59
|
-
case 1006:
|
|
60
|
-
return 22; // int2vector
|
|
61
|
-
case 1007:
|
|
62
|
-
return 23; // int4
|
|
63
|
-
case 1008:
|
|
64
|
-
return 24; // regproc
|
|
65
|
-
case 1009:
|
|
66
|
-
return 25; // text
|
|
67
|
-
case 1028:
|
|
68
|
-
return 26; // oid
|
|
69
|
-
case 1010:
|
|
70
|
-
return 27; // tid
|
|
71
|
-
case 1011:
|
|
72
|
-
return 28; // xid
|
|
73
|
-
case 1012:
|
|
74
|
-
return 29; // cid
|
|
75
|
-
case 1013:
|
|
76
|
-
return 30; // oidvector
|
|
77
|
-
case 210:
|
|
78
|
-
return 71; // pg_type
|
|
79
|
-
case 270:
|
|
80
|
-
return 75; // pg_attribute
|
|
81
|
-
case 272:
|
|
82
|
-
return 81; // pg_proc
|
|
83
|
-
case 273:
|
|
84
|
-
return 83; // pg_class
|
|
85
|
-
case 199:
|
|
86
|
-
return 114; // json
|
|
87
|
-
case 143:
|
|
88
|
-
return 142; // xml
|
|
89
|
-
case 271:
|
|
90
|
-
return 5069; // xid8
|
|
91
|
-
case 1017:
|
|
92
|
-
return 600; // point
|
|
93
|
-
case 1018:
|
|
94
|
-
return 601; // lseg
|
|
95
|
-
case 1019:
|
|
96
|
-
return 602; // path
|
|
97
|
-
case 1020:
|
|
98
|
-
return 603; // box
|
|
99
|
-
case 1027:
|
|
100
|
-
return 604; // polygon
|
|
101
|
-
case 629:
|
|
102
|
-
return 628; // line
|
|
103
|
-
case 1021:
|
|
104
|
-
return 700; // float4
|
|
105
|
-
case 1022:
|
|
106
|
-
return 701; // float8
|
|
107
|
-
case 0:
|
|
108
|
-
return 705; // unknown
|
|
109
|
-
case 719:
|
|
110
|
-
return 718; // circle
|
|
111
|
-
case 791:
|
|
112
|
-
return 790; // money
|
|
113
|
-
case 1040:
|
|
114
|
-
return 829; // macaddr
|
|
115
|
-
case 1041:
|
|
116
|
-
return 869; // inet
|
|
117
|
-
case 651:
|
|
118
|
-
return 650; // cidr
|
|
119
|
-
case 775:
|
|
120
|
-
return 774; // macaddr8
|
|
121
|
-
case 1034:
|
|
122
|
-
return 1033; // aclitem
|
|
123
|
-
case 1014:
|
|
124
|
-
return 1042; // bpchar
|
|
125
|
-
case 1015:
|
|
126
|
-
return 1043; // varchar
|
|
127
|
-
case 1182:
|
|
128
|
-
return 1082; // date
|
|
129
|
-
case 1183:
|
|
130
|
-
return 1083; // time
|
|
131
|
-
case 1115:
|
|
132
|
-
return 1114; // timestamp
|
|
133
|
-
case 1185:
|
|
134
|
-
return 1184; // timestamptz
|
|
135
|
-
case 1187:
|
|
136
|
-
return 1186; // interval
|
|
137
|
-
case 1270:
|
|
138
|
-
return 1266; // timetz
|
|
139
|
-
case 1561:
|
|
140
|
-
return 1560; // bit
|
|
141
|
-
case 1563:
|
|
142
|
-
return 1562; // varbit
|
|
143
|
-
case 1231:
|
|
144
|
-
return 1700; // numeric
|
|
145
|
-
case 2201:
|
|
146
|
-
return 1790; // refcursor
|
|
147
|
-
case 2207:
|
|
148
|
-
return 2202; // regprocedure
|
|
149
|
-
case 2208:
|
|
150
|
-
return 2203; // regoper
|
|
151
|
-
case 2209:
|
|
152
|
-
return 2204; // regoperator
|
|
153
|
-
case 2210:
|
|
154
|
-
return 2205; // regclass
|
|
155
|
-
case 4192:
|
|
156
|
-
return 4191; // regcollation
|
|
157
|
-
case 2211:
|
|
158
|
-
return 2206; // regtype
|
|
159
|
-
case 4097:
|
|
160
|
-
return 4096; // regrole
|
|
161
|
-
case 4090:
|
|
162
|
-
return 4089; // regnamespace
|
|
163
|
-
case 2951:
|
|
164
|
-
return 2950; // uuid
|
|
165
|
-
case 3221:
|
|
166
|
-
return 3220; // pg_lsn
|
|
167
|
-
case 3643:
|
|
168
|
-
return 3614; // tsvector
|
|
169
|
-
case 3644:
|
|
170
|
-
return 3642; // gtsvector
|
|
171
|
-
case 3645:
|
|
172
|
-
return 3615; // tsquery
|
|
173
|
-
case 3735:
|
|
174
|
-
return 3734; // regconfig
|
|
175
|
-
case 3770:
|
|
176
|
-
return 3769; // regdictionary
|
|
177
|
-
case 3807:
|
|
178
|
-
return 3802; // jsonb
|
|
179
|
-
case 4073:
|
|
180
|
-
return 4072; // jsonpath
|
|
181
|
-
}
|
|
142
|
+
// select 'case ' || typarray || ': return ' || oid || '; // ' || typname from pg_catalog.pg_type WHERE typarray != 0;
|
|
143
|
+
return ARRAY_TO_ELEM_OID.get(arrayTypeOid);
|
|
182
144
|
}
|
|
183
145
|
static _decodeArray(text, elemTypeOid) {
|
|
184
146
|
text = text.replace(/^\[.+=/, ''); // skip dimensions
|
|
@@ -235,22 +197,4 @@ export class PgType {
|
|
|
235
197
|
return '\\x' + Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
236
198
|
}
|
|
237
199
|
}
|
|
238
|
-
/**
|
|
239
|
-
* We need a high level of control over how values are decoded, to make sure there is no loss
|
|
240
|
-
* of precision in the process.
|
|
241
|
-
*/
|
|
242
|
-
export function decodeTuple(relation, tupleRaw) {
|
|
243
|
-
let result = {};
|
|
244
|
-
for (let columnName in tupleRaw) {
|
|
245
|
-
const rawval = tupleRaw[columnName];
|
|
246
|
-
const typeOid = relation._tupleDecoder._typeOids.get(columnName);
|
|
247
|
-
if (typeof rawval == 'string' && typeOid) {
|
|
248
|
-
result[columnName] = PgType.decode(rawval, typeOid);
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
result[columnName] = rawval;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return result;
|
|
255
|
-
}
|
|
256
200
|
//# sourceMappingURL=pgwire_types.js.map
|
package/dist/pgwire_types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgwire_types.js","sourceRoot":"","sources":["../src/pgwire_types.ts"],"names":[],"mappings":"AAAA,0GAA0G;
|
|
1
|
+
{"version":3,"file":"pgwire_types.js","sourceRoot":"","sources":["../src/pgwire_types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
import tls from 'node:tls';
|
|
3
|
+
export interface ConnectOptions {
|
|
4
|
+
hostname: string;
|
|
5
|
+
port: number;
|
|
6
|
+
tlsOptions?: tls.ConnectionOptions | false;
|
|
7
|
+
lookup?: net.LookupFunction;
|
|
8
|
+
}
|
|
9
|
+
export declare class SocketAdapter {
|
|
10
|
+
private options;
|
|
11
|
+
static connect(options: ConnectOptions): Promise<SocketAdapter>;
|
|
12
|
+
_socket: net.Socket;
|
|
13
|
+
_error: Error | null;
|
|
14
|
+
constructor(socket: net.Socket, options: ConnectOptions);
|
|
15
|
+
_readResume: () => void;
|
|
16
|
+
_writeResume: () => void;
|
|
17
|
+
_readPauseAsync: (resolve: () => void) => void;
|
|
18
|
+
_writePauseAsync: (resolve: () => void) => void;
|
|
19
|
+
setTimeout(timeout: number): void;
|
|
20
|
+
startTls(host: string, ca: any): Promise<SocketAdapter>;
|
|
21
|
+
read(out: Uint8Array): Promise<any>;
|
|
22
|
+
write(data: Uint8Array): Promise<number>;
|
|
23
|
+
close(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Fork of pgwire/index.js, customized to handle additional TLS options
|
|
2
|
+
import { once } from 'node:events';
|
|
3
|
+
import net from 'node:net';
|
|
4
|
+
import tls from 'node:tls';
|
|
5
|
+
import { recordBytesRead } from './metrics.js';
|
|
6
|
+
// pgwire doesn't natively support configuring timeouts, but we just hardcode a default.
|
|
7
|
+
// Timeout idle connections after 6 minutes (we ping at least every 5 minutes).
|
|
8
|
+
const POWERSYNC_SOCKET_DEFAULT_TIMEOUT = 360_000;
|
|
9
|
+
// Timeout for the initial connection (pre-TLS)
|
|
10
|
+
// Must be less than the timeout for a HTTP request
|
|
11
|
+
const POWERSYNC_SOCKET_CONNECT_TIMEOUT = 20_000;
|
|
12
|
+
// TCP keepalive delay in milliseconds.
|
|
13
|
+
// This can help detect dead connections earlier.
|
|
14
|
+
const POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY = 40_000;
|
|
15
|
+
export class SocketAdapter {
|
|
16
|
+
options;
|
|
17
|
+
static async connect(options) {
|
|
18
|
+
// Custom timeout handling
|
|
19
|
+
const socket = net.connect({
|
|
20
|
+
host: options.hostname,
|
|
21
|
+
port: options.port,
|
|
22
|
+
lookup: options.lookup,
|
|
23
|
+
// This closes the connection if no data was sent or received for the given time,
|
|
24
|
+
// even if the connection is still actaully alive.
|
|
25
|
+
timeout: POWERSYNC_SOCKET_DEFAULT_TIMEOUT,
|
|
26
|
+
// This configures TCP keepalive.
|
|
27
|
+
keepAlive: true,
|
|
28
|
+
keepAliveInitialDelay: POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY
|
|
29
|
+
// Unfortunately it is not possible to set tcp_keepalive_intvl or
|
|
30
|
+
// tcp_keepalive_probes here.
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
const timeout = setTimeout(() => {
|
|
34
|
+
socket.destroy(new Error(`Timeout while connecting to ${options.hostname}:${options.port}`));
|
|
35
|
+
}, POWERSYNC_SOCKET_CONNECT_TIMEOUT);
|
|
36
|
+
await once(socket, 'connect');
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
return new SocketAdapter(socket, options);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
socket.destroy();
|
|
42
|
+
throw e;
|
|
43
|
+
}
|
|
44
|
+
// END POWERSYNC
|
|
45
|
+
}
|
|
46
|
+
_socket;
|
|
47
|
+
_error;
|
|
48
|
+
constructor(socket, options) {
|
|
49
|
+
this.options = options;
|
|
50
|
+
this._error = null;
|
|
51
|
+
this._socket = socket;
|
|
52
|
+
this._socket.on('readable', (_) => this._readResume());
|
|
53
|
+
this._socket.on('end', () => this._readResume());
|
|
54
|
+
// Custom timeout handling
|
|
55
|
+
this._socket.on('timeout', () => {
|
|
56
|
+
this._socket.destroy(new Error('Socket idle timeout'));
|
|
57
|
+
});
|
|
58
|
+
this._socket.on('error', (error) => {
|
|
59
|
+
this._error = error;
|
|
60
|
+
this._readResume();
|
|
61
|
+
this._writeResume();
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
_readResume = () => {
|
|
65
|
+
// noop
|
|
66
|
+
return;
|
|
67
|
+
};
|
|
68
|
+
_writeResume = () => {
|
|
69
|
+
// noop
|
|
70
|
+
return;
|
|
71
|
+
};
|
|
72
|
+
_readPauseAsync = (resolve) => {
|
|
73
|
+
this._readResume = resolve;
|
|
74
|
+
};
|
|
75
|
+
_writePauseAsync = (resolve) => {
|
|
76
|
+
this._writeResume = resolve;
|
|
77
|
+
};
|
|
78
|
+
setTimeout(timeout) {
|
|
79
|
+
this._socket.setTimeout(timeout);
|
|
80
|
+
}
|
|
81
|
+
async startTls(host, ca) {
|
|
82
|
+
// START POWERSYNC CUSTOM OPTIONS HANDLING
|
|
83
|
+
const tlsOptions = this.options.tlsOptions;
|
|
84
|
+
// https://nodejs.org/docs/latest-v14.x/api/tls.html#tls_tls_connect_options_callback
|
|
85
|
+
const socket = this._socket;
|
|
86
|
+
const tlsSocket = tls.connect({ socket, host, ...tlsOptions });
|
|
87
|
+
// END POWERSYNC CUSTOM OPTIONS HANDLING
|
|
88
|
+
await once(tlsSocket, 'secureConnect');
|
|
89
|
+
// TODO check tlsSocket.authorized
|
|
90
|
+
// if secure connection succeeded then we take underlying socket ownership,
|
|
91
|
+
// otherwise underlying socket should be closed outside.
|
|
92
|
+
tlsSocket.on('close', (_) => socket.destroy());
|
|
93
|
+
return new SocketAdapter(tlsSocket, this.options);
|
|
94
|
+
}
|
|
95
|
+
async read(out) {
|
|
96
|
+
let buf;
|
|
97
|
+
for (;;) {
|
|
98
|
+
if (this._error)
|
|
99
|
+
throw this._error; // TODO callstack
|
|
100
|
+
if (this._socket.readableEnded)
|
|
101
|
+
return null;
|
|
102
|
+
// POWERSYNC FIX: Read only as much data as available, instead of reading everything and
|
|
103
|
+
// unshifting back onto the socket
|
|
104
|
+
const toRead = Math.min(out.length, this._socket.readableLength);
|
|
105
|
+
buf = this._socket.read(toRead);
|
|
106
|
+
if (buf?.length)
|
|
107
|
+
break;
|
|
108
|
+
if (!buf)
|
|
109
|
+
await new Promise(this._readPauseAsync);
|
|
110
|
+
}
|
|
111
|
+
if (buf.length > out.length) {
|
|
112
|
+
throw new Error('Read more data than expected');
|
|
113
|
+
}
|
|
114
|
+
out.set(buf);
|
|
115
|
+
// POWERSYNC: Add metrics
|
|
116
|
+
recordBytesRead(buf.length);
|
|
117
|
+
return buf.length;
|
|
118
|
+
}
|
|
119
|
+
async write(data) {
|
|
120
|
+
// TODO assert Uint8Array
|
|
121
|
+
// TODO need to copy data?
|
|
122
|
+
if (this._error)
|
|
123
|
+
throw this._error; // TODO callstack
|
|
124
|
+
const p = new Promise(this._writePauseAsync);
|
|
125
|
+
this._socket.write(data, this._writeResume);
|
|
126
|
+
await p;
|
|
127
|
+
if (this._error)
|
|
128
|
+
throw this._error; // TODO callstack
|
|
129
|
+
return data.length;
|
|
130
|
+
}
|
|
131
|
+
// async closeWrite() {
|
|
132
|
+
// if (this._error) throw this._error; // TODO callstack
|
|
133
|
+
// const socket_end = promisify(cb => this._socket.end(cb));
|
|
134
|
+
// await socket_end();
|
|
135
|
+
// }
|
|
136
|
+
close() {
|
|
137
|
+
this._socket.destroy(Error('socket destroyed'));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=socket_adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket_adapter.js","sourceRoot":"","sources":["../src/socket_adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as net from 'node:net';
|
|
2
|
+
import * as tls from 'node:tls';
|
|
2
3
|
import * as pgwire from './pgwire.js';
|
|
3
4
|
export interface NormalizedConnectionConfig {
|
|
4
5
|
id: string;
|
|
@@ -10,6 +11,16 @@ export interface NormalizedConnectionConfig {
|
|
|
10
11
|
password: string;
|
|
11
12
|
sslmode: 'verify-full' | 'verify-ca' | 'disable';
|
|
12
13
|
cacert: string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Specify to use a servername for TLS that is different from hostname.
|
|
16
|
+
*
|
|
17
|
+
* Only relevant if sslmode = 'verify-full'.
|
|
18
|
+
*/
|
|
19
|
+
tls_servername: string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Hostname lookup function.
|
|
22
|
+
*/
|
|
23
|
+
lookup?: net.LookupFunction;
|
|
13
24
|
client_certificate: string | undefined;
|
|
14
25
|
client_private_key: string | undefined;
|
|
15
26
|
}
|
|
@@ -17,7 +28,7 @@ export interface PgWireConnectionOptions extends NormalizedConnectionConfig {
|
|
|
17
28
|
resolved_ip?: string;
|
|
18
29
|
}
|
|
19
30
|
export declare function clientTlsOptions(options: PgWireConnectionOptions): tls.ConnectionOptions;
|
|
20
|
-
export declare function
|
|
31
|
+
export declare function makeTlsOptions(options: PgWireConnectionOptions): false | tls.ConnectionOptions;
|
|
21
32
|
export declare function connectPgWire(config: PgWireConnectionOptions, options?: {
|
|
22
33
|
type?: 'standard' | 'replication';
|
|
23
34
|
}): Promise<pgwire.PgConnection>;
|
|
@@ -41,14 +52,6 @@ export interface PgPoolOptions {
|
|
|
41
52
|
* The pool cannot be used for transactions, and cannot be used for logical replication.
|
|
42
53
|
*/
|
|
43
54
|
export declare function connectPgWirePool(config: PgWireConnectionOptions, options?: PgPoolOptions): pgwire.PgClient;
|
|
44
|
-
/**
|
|
45
|
-
* Hack: sslrootcert is passed through as-is to pgwire_node.
|
|
46
|
-
*
|
|
47
|
-
* We use that to pass in custom TLS options, without having to modify pgwire itself.
|
|
48
|
-
*/
|
|
49
|
-
export interface ExtendedPgwireOptions extends pgwire.PgConnectKnownOptions {
|
|
50
|
-
sslrootcert?: false | tls.ConnectionOptions;
|
|
51
|
-
}
|
|
52
55
|
export declare function lsnMakeComparable(text: string): string;
|
|
53
56
|
/**
|
|
54
57
|
* Convert a postgres timestamptz to a SQLite-compatible/normalized timestamp.
|
|
@@ -83,4 +86,4 @@ export declare function dateToSqlite(source?: string): string | null;
|
|
|
83
86
|
*
|
|
84
87
|
* This converts it to objects.
|
|
85
88
|
*/
|
|
86
|
-
export declare function pgwireRows(rs: pgwire.PgResult):
|
|
89
|
+
export declare function pgwireRows<T = Record<string, any>>(rs: pgwire.PgResult): T[];
|
package/dist/util.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import * as datefns from 'date-fns';
|
|
1
2
|
import { DEFAULT_CERTS } from './certs.js';
|
|
2
3
|
import * as pgwire from './pgwire.js';
|
|
3
4
|
import { PgType } from './pgwire_types.js';
|
|
4
|
-
import * as datefns from 'date-fns';
|
|
5
5
|
export function clientTlsOptions(options) {
|
|
6
6
|
if (options.client_certificate && options.client_private_key) {
|
|
7
7
|
return {
|
|
@@ -13,7 +13,7 @@ export function clientTlsOptions(options) {
|
|
|
13
13
|
return {};
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
export function
|
|
16
|
+
export function makeTlsOptions(options) {
|
|
17
17
|
if (options.sslmode == 'disable') {
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
@@ -26,7 +26,7 @@ export function tlsOptions(options) {
|
|
|
26
26
|
// This may be different from the host we're connecting to if we pre-resolved
|
|
27
27
|
// the IP.
|
|
28
28
|
host: options.hostname,
|
|
29
|
-
servername: options.hostname,
|
|
29
|
+
servername: options.tls_servername ?? options.hostname,
|
|
30
30
|
...clientTlsOptions(options)
|
|
31
31
|
};
|
|
32
32
|
}
|
|
@@ -60,18 +60,23 @@ export async function connectPgWire(config, options) {
|
|
|
60
60
|
if (options?.type != 'standard') {
|
|
61
61
|
connectionOptions.replication = 'database';
|
|
62
62
|
}
|
|
63
|
+
let tlsOptions = false;
|
|
63
64
|
if (config.sslmode != 'disable') {
|
|
64
65
|
connectionOptions.sslmode = 'require';
|
|
65
|
-
|
|
66
|
-
// Just the easiest way to pass on our config to pgwire_node.js
|
|
67
|
-
connectionOptions.sslrootcert = tlsOptions(config);
|
|
66
|
+
tlsOptions = makeTlsOptions(config);
|
|
68
67
|
}
|
|
69
68
|
else {
|
|
70
69
|
connectionOptions.sslmode = 'disable';
|
|
71
70
|
}
|
|
72
|
-
const connection =
|
|
71
|
+
const connection = pgwire.pgconnection(connectionOptions);
|
|
72
|
+
// HACK: Not standard pgwire options
|
|
73
|
+
// Just the easiest way to pass on our config to SocketAdapter
|
|
74
|
+
const connectOptions = connection._connectOptions;
|
|
75
|
+
connectOptions.tlsOptions = tlsOptions;
|
|
76
|
+
connectOptions.lookup = config.lookup;
|
|
73
77
|
// HACK: Replace row decoding with our own implementation
|
|
74
78
|
connection._recvDataRow = _recvDataRow;
|
|
79
|
+
await connection.start();
|
|
75
80
|
return connection;
|
|
76
81
|
}
|
|
77
82
|
function _recvDataRow(_message, row, batch) {
|
|
@@ -109,11 +114,10 @@ export function connectPgWirePool(config, options) {
|
|
|
109
114
|
_poolSize: maxSize,
|
|
110
115
|
_poolIdleTimeout: idleTimeout
|
|
111
116
|
};
|
|
117
|
+
let tlsOptions = false;
|
|
112
118
|
if (config.sslmode != 'disable') {
|
|
113
119
|
connectionOptions.sslmode = 'require';
|
|
114
|
-
|
|
115
|
-
// Just the easiest way to pass on our config to pgwire_node.js
|
|
116
|
-
connectionOptions.sslrootcert = tlsOptions(config);
|
|
120
|
+
tlsOptions = makeTlsOptions(config);
|
|
117
121
|
}
|
|
118
122
|
else {
|
|
119
123
|
connectionOptions.sslmode = 'disable';
|
|
@@ -122,6 +126,9 @@ export function connectPgWirePool(config, options) {
|
|
|
122
126
|
const originalGetConnection = pool._getConnection;
|
|
123
127
|
pool._getConnection = function () {
|
|
124
128
|
const con = originalGetConnection.call(this);
|
|
129
|
+
const connectOptions = con._connectOptions;
|
|
130
|
+
connectOptions.tlsOptions = tlsOptions;
|
|
131
|
+
connectOptions.lookup = config.lookup;
|
|
125
132
|
// HACK: Replace row decoding with our own implementation
|
|
126
133
|
con._recvDataRow = _recvDataRow;
|
|
127
134
|
return con;
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.20.0",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"files": [
|
|
@@ -16,9 +16,7 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"date-fns": "^4.1.0",
|
|
18
18
|
"pgwire": "github:kagis/pgwire#f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87",
|
|
19
|
-
"@powersync/service-jsonbig": "^0.17.10"
|
|
20
|
-
"@powersync/service-types": "^0.7.0",
|
|
21
|
-
"@powersync/service-sync-rules": "^0.23.1"
|
|
19
|
+
"@powersync/service-jsonbig": "^0.17.10"
|
|
22
20
|
},
|
|
23
21
|
"scripts": {
|
|
24
22
|
"clean": "rm -r ./dist && tsc -b --clean",
|