@powersync/service-jpgwire 0.0.0-dev-20250108073049 → 0.0.0-dev-20250116115804
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 +0 -7
- package/dist/pgwire_types.js +1 -19
- package/dist/pgwire_types.js.map +1 -1
- package/dist/socket_adapter.d.ts +24 -0
- package/dist/socket_adapter.js +137 -0
- package/dist/socket_adapter.js.map +1 -0
- package/dist/util.d.ts +13 -10
- 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,5 +1,3 @@
|
|
|
1
|
-
import type { PgoutputRelation } from 'pgwire/mod.js';
|
|
2
|
-
import { DatabaseInputRow } from '@powersync/service-sync-rules';
|
|
3
1
|
export declare class PgType {
|
|
4
2
|
static decode(text: string, typeOid: number): any;
|
|
5
3
|
static _elemTypeOid(arrayTypeOid: number): 25 | 2950 | 1043 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 71 | 75 | 81 | 83 | 114 | 142 | 5069 | 600 | 601 | 602 | 603 | 604 | 628 | 700 | 701 | 705 | 718 | 790 | 829 | 869 | 650 | 774 | 1033 | 1042 | 1082 | 1083 | 1114 | 1184 | 1186 | 1266 | 1560 | 1562 | 1700 | 1790 | 2202 | 2203 | 2204 | 2205 | 4191 | 2206 | 4096 | 4089 | 3220 | 3614 | 3642 | 3615 | 3734 | 3769 | 3802 | 4072 | undefined;
|
|
@@ -7,8 +5,3 @@ export declare class PgType {
|
|
|
7
5
|
static _decodeBytea(text: string): Uint8Array;
|
|
8
6
|
static _encodeBytea(bytes: Uint8Array): string;
|
|
9
7
|
}
|
|
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,6 +1,6 @@
|
|
|
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
4
|
export class PgType {
|
|
5
5
|
static decode(text, typeOid) {
|
|
6
6
|
switch (typeOid // add line here when register new type
|
|
@@ -235,22 +235,4 @@ export class PgType {
|
|
|
235
235
|
return '\\x' + Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
236
236
|
}
|
|
237
237
|
}
|
|
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
238
|
//# 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,137 @@
|
|
|
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 = 360000;
|
|
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 = 20000;
|
|
12
|
+
// TCP keepalive delay in milliseconds.
|
|
13
|
+
// This can help detect dead connections earlier.
|
|
14
|
+
const POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY = 40000;
|
|
15
|
+
export class SocketAdapter {
|
|
16
|
+
static async connect(options) {
|
|
17
|
+
// Custom timeout handling
|
|
18
|
+
const socket = net.connect({
|
|
19
|
+
host: options.hostname,
|
|
20
|
+
port: options.port,
|
|
21
|
+
lookup: options.lookup,
|
|
22
|
+
// This closes the connection if no data was sent or received for the given time,
|
|
23
|
+
// even if the connection is still actaully alive.
|
|
24
|
+
timeout: POWERSYNC_SOCKET_DEFAULT_TIMEOUT,
|
|
25
|
+
// This configures TCP keepalive.
|
|
26
|
+
keepAlive: true,
|
|
27
|
+
keepAliveInitialDelay: POWERSYNC_SOCKET_KEEPALIVE_INITIAL_DELAY
|
|
28
|
+
// Unfortunately it is not possible to set tcp_keepalive_intvl or
|
|
29
|
+
// tcp_keepalive_probes here.
|
|
30
|
+
});
|
|
31
|
+
try {
|
|
32
|
+
const timeout = setTimeout(() => {
|
|
33
|
+
socket.destroy(new Error(`Timeout while connecting to ${options.hostname}:${options.port}`));
|
|
34
|
+
}, POWERSYNC_SOCKET_CONNECT_TIMEOUT);
|
|
35
|
+
await once(socket, 'connect');
|
|
36
|
+
clearTimeout(timeout);
|
|
37
|
+
return new SocketAdapter(socket, options);
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
socket.destroy();
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
// END POWERSYNC
|
|
44
|
+
}
|
|
45
|
+
constructor(socket, options) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
this._readResume = () => {
|
|
48
|
+
// noop
|
|
49
|
+
return;
|
|
50
|
+
};
|
|
51
|
+
this._writeResume = () => {
|
|
52
|
+
// noop
|
|
53
|
+
return;
|
|
54
|
+
};
|
|
55
|
+
this._readPauseAsync = (resolve) => {
|
|
56
|
+
this._readResume = resolve;
|
|
57
|
+
};
|
|
58
|
+
this._writePauseAsync = (resolve) => {
|
|
59
|
+
this._writeResume = resolve;
|
|
60
|
+
};
|
|
61
|
+
this._error = null;
|
|
62
|
+
this._socket = socket;
|
|
63
|
+
this._socket.on('readable', (_) => this._readResume());
|
|
64
|
+
this._socket.on('end', () => this._readResume());
|
|
65
|
+
// Custom timeout handling
|
|
66
|
+
this._socket.on('timeout', () => {
|
|
67
|
+
this._socket.destroy(new Error('Socket idle timeout'));
|
|
68
|
+
});
|
|
69
|
+
this._socket.on('error', (error) => {
|
|
70
|
+
this._error = error;
|
|
71
|
+
this._readResume();
|
|
72
|
+
this._writeResume();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
setTimeout(timeout) {
|
|
76
|
+
this._socket.setTimeout(timeout);
|
|
77
|
+
}
|
|
78
|
+
async startTls(host, ca) {
|
|
79
|
+
// START POWERSYNC CUSTOM OPTIONS HANDLING
|
|
80
|
+
const tlsOptions = this.options.tlsOptions;
|
|
81
|
+
// https://nodejs.org/docs/latest-v14.x/api/tls.html#tls_tls_connect_options_callback
|
|
82
|
+
const socket = this._socket;
|
|
83
|
+
const tlsSocket = tls.connect({ socket, host, ...tlsOptions });
|
|
84
|
+
// END POWERSYNC CUSTOM OPTIONS HANDLING
|
|
85
|
+
await once(tlsSocket, 'secureConnect');
|
|
86
|
+
// TODO check tlsSocket.authorized
|
|
87
|
+
// if secure connection succeeded then we take underlying socket ownership,
|
|
88
|
+
// otherwise underlying socket should be closed outside.
|
|
89
|
+
tlsSocket.on('close', (_) => socket.destroy());
|
|
90
|
+
return new SocketAdapter(tlsSocket, this.options);
|
|
91
|
+
}
|
|
92
|
+
async read(out) {
|
|
93
|
+
let buf;
|
|
94
|
+
for (;;) {
|
|
95
|
+
if (this._error)
|
|
96
|
+
throw this._error; // TODO callstack
|
|
97
|
+
if (this._socket.readableEnded)
|
|
98
|
+
return null;
|
|
99
|
+
// POWERSYNC FIX: Read only as much data as available, instead of reading everything and
|
|
100
|
+
// unshifting back onto the socket
|
|
101
|
+
const toRead = Math.min(out.length, this._socket.readableLength);
|
|
102
|
+
buf = this._socket.read(toRead);
|
|
103
|
+
if (buf?.length)
|
|
104
|
+
break;
|
|
105
|
+
if (!buf)
|
|
106
|
+
await new Promise(this._readPauseAsync);
|
|
107
|
+
}
|
|
108
|
+
if (buf.length > out.length) {
|
|
109
|
+
throw new Error('Read more data than expected');
|
|
110
|
+
}
|
|
111
|
+
out.set(buf);
|
|
112
|
+
// POWERSYNC: Add metrics
|
|
113
|
+
recordBytesRead(buf.length);
|
|
114
|
+
return buf.length;
|
|
115
|
+
}
|
|
116
|
+
async write(data) {
|
|
117
|
+
// TODO assert Uint8Array
|
|
118
|
+
// TODO need to copy data?
|
|
119
|
+
if (this._error)
|
|
120
|
+
throw this._error; // TODO callstack
|
|
121
|
+
const p = new Promise(this._writePauseAsync);
|
|
122
|
+
this._socket.write(data, this._writeResume);
|
|
123
|
+
await p;
|
|
124
|
+
if (this._error)
|
|
125
|
+
throw this._error; // TODO callstack
|
|
126
|
+
return data.length;
|
|
127
|
+
}
|
|
128
|
+
// async closeWrite() {
|
|
129
|
+
// if (this._error) throw this._error; // TODO callstack
|
|
130
|
+
// const socket_end = promisify(cb => this._socket.end(cb));
|
|
131
|
+
// await socket_end();
|
|
132
|
+
// }
|
|
133
|
+
close() {
|
|
134
|
+
this._socket.destroy(Error('socket destroyed'));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=socket_adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket_adapter.js","sourceRoot":"","sources":["../src/socket_adapter.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,wFAAwF;AACxF,+EAA+E;AAC/E,MAAM,gCAAgC,GAAG,MAAO,CAAC;AAEjD,+CAA+C;AAC/C,mDAAmD;AACnD,MAAM,gCAAgC,GAAG,KAAM,CAAC;AAEhD,uCAAuC;AACvC,iDAAiD;AACjD,MAAM,wCAAwC,GAAG,KAAM,CAAC;AASxD,MAAM,OAAO,aAAa;IACxB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAuB;QAC1C,0BAA0B;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YAEtB,iFAAiF;YACjF,kDAAkD;YAClD,OAAO,EAAE,gCAAgC;YAEzC,iCAAiC;YACjC,SAAS,EAAE,IAAI;YACf,qBAAqB,EAAE,wCAAwC;YAC/D,iEAAiE;YACjE,6BAA6B;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/F,CAAC,EAAE,gCAAgC,CAAC,CAAC;YACrC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC9B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,CAAC;QACV,CAAC;QACD,gBAAgB;IAClB,CAAC;IAKD,YACE,MAAkB,EACV,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAiBjC,gBAAW,GAAG,GAAG,EAAE;YACjB,OAAO;YACP,OAAO;QACT,CAAC,CAAC;QACF,iBAAY,GAAG,GAAG,EAAE;YAClB,OAAO;YACP,OAAO;QACT,CAAC,CAAC;QAEF,oBAAe,GAAG,CAAC,OAAmB,EAAE,EAAE;YACxC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC7B,CAAC,CAAC;QACF,qBAAgB,GAAG,CAAC,OAAmB,EAAE,EAAE;YACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC;QA7BA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAkBD,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAO;QAClC,0CAA0C;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAE3C,qFAAqF;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;QAC/D,wCAAwC;QACxC,MAAM,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACvC,kCAAkC;QAElC,2EAA2E;QAC3E,wDAAwD;QACxD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAe;QACxB,IAAI,GAAG,CAAC;QACR,SAAS,CAAC;YACR,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB;YACrD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;gBAAE,OAAO,IAAI,CAAC;YAC5C,wFAAwF;YACxF,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACjE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,GAAG,EAAE,MAAM;gBAAE,MAAM;YACvB,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,OAAO,CAAO,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,yBAAyB;QACzB,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAgB;QAC1B,yBAAyB;QACzB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB;QACrD,MAAM,CAAC,GAAG,IAAI,OAAO,CAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC;QACR,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,uBAAuB;IACvB,0DAA0D;IAC1D,8DAA8D;IAC9D,wBAAwB;IACxB,IAAI;IACJ,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
|
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.
|
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.0.0-dev-
|
|
8
|
+
"version": "0.0.0-dev-20250116115804",
|
|
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.0.0-dev-20250108073049",
|
|
21
|
-
"@powersync/service-sync-rules": "^0.0.0-dev-20250108073049"
|
|
19
|
+
"@powersync/service-jsonbig": "^0.17.10"
|
|
22
20
|
},
|
|
23
21
|
"scripts": {
|
|
24
22
|
"clean": "rm -r ./dist && tsc -b --clean",
|