@ontemper/sdk 0.7.1-postgresql.5 → 0.8.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/LICENSE +28 -0
- package/README.md +8 -81
- package/dist/As2Resource.d.ts +76 -431
- package/dist/As2Resource.d.ts.map +1 -1
- package/dist/As2Resource.js +30 -31
- package/dist/As2Resource.js.map +1 -1
- package/dist/As2Transport.d.ts.map +1 -1
- package/dist/As2Transport.js +1 -3
- package/dist/As2Transport.js.map +1 -1
- package/dist/As2Wire.d.ts +0 -39
- package/dist/As2Wire.d.ts.map +1 -1
- package/dist/Contract/RuntimeApi.d.ts +0 -19
- package/dist/Contract/RuntimeApi.d.ts.map +1 -1
- package/dist/Contract/RuntimeApi.js +1 -1
- package/dist/Contract/RuntimeApi.js.map +1 -1
- package/dist/Edi.d.ts.map +1 -1
- package/dist/Edi.js +5 -6
- package/dist/Edi.js.map +1 -1
- package/dist/HttpApiResource.d.ts +160 -2899
- package/dist/HttpApiResource.d.ts.map +1 -1
- package/dist/HttpApiResource.js +60 -82
- package/dist/HttpApiResource.js.map +1 -1
- package/dist/Manifest.d.ts +1 -1
- package/dist/Manifest.d.ts.map +1 -1
- package/dist/Manifest.js +1 -1
- package/dist/Manifest.js.map +1 -1
- package/dist/Redaction.d.ts +1 -5
- package/dist/Redaction.d.ts.map +1 -1
- package/dist/Redaction.js +6 -28
- package/dist/Redaction.js.map +1 -1
- package/dist/ResourcesErrors.d.ts +1 -5
- package/dist/ResourcesErrors.d.ts.map +1 -1
- package/dist/ResourcesErrors.js +2 -5
- package/dist/ResourcesErrors.js.map +1 -1
- package/dist/ResourcesToken.d.ts +0 -9
- package/dist/ResourcesToken.d.ts.map +1 -1
- package/dist/ResourcesToken.js +7 -20
- package/dist/ResourcesToken.js.map +1 -1
- package/dist/RuntimeResources.d.ts +2 -29
- package/dist/RuntimeResources.d.ts.map +1 -1
- package/dist/RuntimeResources.js +19 -58
- package/dist/RuntimeResources.js.map +1 -1
- package/dist/TransportResource.d.ts +32 -1
- package/dist/TransportResource.d.ts.map +1 -1
- package/dist/TransportResource.js +19 -1
- package/dist/TransportResource.js.map +1 -1
- package/dist/Workflow.js +2 -2
- package/dist/Workflow.js.map +1 -1
- package/package.json +7 -39
- package/dist/DatabaseTunnelAuthorization.d.ts +0 -11
- package/dist/DatabaseTunnelAuthorization.d.ts.map +0 -1
- package/dist/DatabaseTunnelAuthorization.js +0 -35
- package/dist/DatabaseTunnelAuthorization.js.map +0 -1
- package/dist/ExpiringMap.d.ts +0 -21
- package/dist/ExpiringMap.d.ts.map +0 -1
- package/dist/ExpiringMap.js +0 -79
- package/dist/ExpiringMap.js.map +0 -1
- package/dist/Kafka.d.ts +0 -89
- package/dist/Kafka.d.ts.map +0 -1
- package/dist/Kafka.js +0 -297
- package/dist/Kafka.js.map +0 -1
- package/dist/PostgreSql.d.ts +0 -24
- package/dist/PostgreSql.d.ts.map +0 -1
- package/dist/PostgreSql.js +0 -55
- package/dist/PostgreSql.js.map +0 -1
- package/dist/PostgreSqlPool.d.ts +0 -32
- package/dist/PostgreSqlPool.d.ts.map +0 -1
- package/dist/PostgreSqlPool.js +0 -118
- package/dist/PostgreSqlPool.js.map +0 -1
- package/dist/PostgreSqlTimeouts.d.ts +0 -6
- package/dist/PostgreSqlTimeouts.d.ts.map +0 -1
- package/dist/PostgreSqlTimeouts.js +0 -17
- package/dist/PostgreSqlTimeouts.js.map +0 -1
- package/dist/PostgreSqlTunnel.d.ts +0 -25
- package/dist/PostgreSqlTunnel.d.ts.map +0 -1
- package/dist/PostgreSqlTunnel.js +0 -114
- package/dist/PostgreSqlTunnel.js.map +0 -1
- package/dist/ResourceRecords.d.ts +0 -1086
- package/dist/ResourceRecords.d.ts.map +0 -1
- package/dist/ResourceRecords.js +0 -303
- package/dist/ResourceRecords.js.map +0 -1
- package/dist/Resources.d.ts +0 -17
- package/dist/Resources.d.ts.map +0 -1
- package/dist/Resources.js +0 -15
- package/dist/Resources.js.map +0 -1
- package/dist/ResourcesCache.d.ts +0 -33
- package/dist/ResourcesCache.d.ts.map +0 -1
- package/dist/ResourcesCache.js +0 -205
- package/dist/ResourcesCache.js.map +0 -1
- package/dist/ResourcesEnv.d.ts +0 -95
- package/dist/ResourcesEnv.d.ts.map +0 -1
- package/dist/ResourcesEnv.js +0 -135
- package/dist/ResourcesEnv.js.map +0 -1
package/dist/PostgreSqlPool.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { Effect, Option, Predicate, Redacted, Schema } from 'effect';
|
|
2
|
-
import { observePostgreSqlTimeouts } from './PostgreSqlTimeouts.js';
|
|
3
|
-
import { registerSecrets } from './Redaction.js';
|
|
4
|
-
import { PostgresqlResource } from './ResourceRecords.js';
|
|
5
|
-
import { InvalidResourceError } from './ResourcesErrors.js';
|
|
6
|
-
export { PostgresqlResource } from './ResourceRecords.js';
|
|
7
|
-
const validate = Schema.toStandardSchemaV1(PostgresqlResource)['~standard'].validate;
|
|
8
|
-
// Names only the failing paths: a schema message can quote the value, which may be a secret.
|
|
9
|
-
const decode = (key, value) => Effect.suspend(() => {
|
|
10
|
-
const result = validate(value);
|
|
11
|
-
if (result instanceof Promise)
|
|
12
|
-
return Effect.die(new Error('PostgresqlResource decodes synchronously'));
|
|
13
|
-
if (result.issues === undefined)
|
|
14
|
-
return Effect.succeed(result.value);
|
|
15
|
-
const paths = result.issues.map((issue) => (issue.path ?? []).map((part) => String(Predicate.isObject(part) ? part.key : part)).join('.') || '(root)');
|
|
16
|
-
return Effect.fail(new InvalidResourceError({
|
|
17
|
-
target: `key ${key}`,
|
|
18
|
-
message: `Resource ${key} does not match the expected schema: invalid ${[...new Set(paths)].join(', ')}`,
|
|
19
|
-
}));
|
|
20
|
-
});
|
|
21
|
-
function sslConfig(resource) {
|
|
22
|
-
const { tls } = resource;
|
|
23
|
-
const clientCertificate = tls?.clientCertificate
|
|
24
|
-
? {
|
|
25
|
-
cert: tls.clientCertificate,
|
|
26
|
-
key: tls.clientKey === undefined ? undefined : Redacted.value(tls.clientKey),
|
|
27
|
-
passphrase: tls.clientKeyPassphrase === undefined ? undefined : Redacted.value(tls.clientKeyPassphrase),
|
|
28
|
-
}
|
|
29
|
-
: {};
|
|
30
|
-
switch (resource.sslmode) {
|
|
31
|
-
case 'disable':
|
|
32
|
-
return false;
|
|
33
|
-
case 'require':
|
|
34
|
-
return { rejectUnauthorized: false, ...clientCertificate };
|
|
35
|
-
case 'verify-ca':
|
|
36
|
-
return {
|
|
37
|
-
rejectUnauthorized: true,
|
|
38
|
-
ca: tls?.caCertificate,
|
|
39
|
-
...clientCertificate,
|
|
40
|
-
checkServerIdentity: () => undefined,
|
|
41
|
-
};
|
|
42
|
-
case 'verify-full':
|
|
43
|
-
return { rejectUnauthorized: true, ca: tls?.caCertificate, ...clientCertificate, servername: tls?.serverName };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// RDS IAM needs a token signer and an SSH tunnel needs a bastion client; neither runs inside this pool.
|
|
47
|
-
const resourcePassword = (key, resource) => {
|
|
48
|
-
const refuse = (message) => Effect.fail(new InvalidResourceError({ target: `key ${key}`, message }));
|
|
49
|
-
if (resource.sshTunnel)
|
|
50
|
-
return refuse(`PostgreSQL Resource ${key} needs an SSH tunnel, which this SDK does not open.`);
|
|
51
|
-
if (resource.auth.type === 'rds_iam') {
|
|
52
|
-
return refuse(`PostgreSQL Resource ${key} uses RDS IAM authentication, which this SDK does not support.`);
|
|
53
|
-
}
|
|
54
|
-
return Effect.succeed(resource.auth.type === 'password' ? Redacted.value(resource.auth.password) : '');
|
|
55
|
-
};
|
|
56
|
-
// `pg` and `ws` are optional peers, so they load when a pool is built: importing `./resources` needs neither.
|
|
57
|
-
const loadOptional = (name, load) => Effect.tryPromise({
|
|
58
|
-
try: load,
|
|
59
|
-
catch: () => new Error(`PostgreSQL Resource pools need the ${name} package: add ${name} to the workflow dependencies.`),
|
|
60
|
-
}).pipe(Effect.orDie);
|
|
61
|
-
const loadPg = loadOptional('pg', () => import('pg').then((module) => module.default));
|
|
62
|
-
const loadTunnel = loadOptional('ws', () => import('./PostgreSqlTunnel.js'));
|
|
63
|
-
const ManagedPlacement = Schema.Struct({ managedDatabasePlacementId: Schema.String });
|
|
64
|
-
const isManaged = Schema.is(ManagedPlacement);
|
|
65
|
-
// The runtime API answers a missing Variable reference with the same 404 as a missing record, so after a found
|
|
66
|
-
// `inspect` a resolve 404 names a broken record, never an absent one.
|
|
67
|
-
const brokenReference = (key) => new InvalidResourceError({
|
|
68
|
-
target: `key ${key}`,
|
|
69
|
-
message: `Resource ${key} exists, but a value it references, such as its password Variable, does not resolve in this environment.`,
|
|
70
|
-
});
|
|
71
|
-
/**
|
|
72
|
-
* Inspects, then resolves the Resource and builds an unconnected pool. `ResourceNotFoundError` means only that no
|
|
73
|
-
* record answers the key. Warnings go through the caller's logger and secret masks, as do the password's masks.
|
|
74
|
-
*/
|
|
75
|
-
export const makeResourcePool = (key, source) => Effect.gen(function* () {
|
|
76
|
-
const record = yield* source.inspect(key);
|
|
77
|
-
const resource = yield* source.resolve(key).pipe(Effect.catchTag('ResourceNotFoundError', () => Effect.fail(brokenReference(key))), Effect.flatMap((value) => decode(key, value)));
|
|
78
|
-
const password = yield* resourcePassword(key, resource);
|
|
79
|
-
yield* registerSecrets([password]);
|
|
80
|
-
const authorize = source.authorizeTunnel;
|
|
81
|
-
const managed = isManaged(record.metadata);
|
|
82
|
-
const driver = yield* loadPg;
|
|
83
|
-
const TunnelStream = managed && authorize ? (yield* loadTunnel).PostgreSqlTunnelStream : undefined;
|
|
84
|
-
const context = yield* Effect.context();
|
|
85
|
-
const warn = (event, message, fields = {}) => {
|
|
86
|
-
Effect.runForkWith(context)(Effect.logWarning(message).pipe(Effect.annotateLogs({ event, ...fields })));
|
|
87
|
-
};
|
|
88
|
-
// Each physical connection reads current runtime authorization, including connections opened after token renewal.
|
|
89
|
-
const stream = TunnelStream && authorize ? () => new TunnelStream(() => authorize(key)) : undefined;
|
|
90
|
-
// A callback prevents pg from substituting ambient PGPASSWORD/pgpass for an empty Resource password.
|
|
91
|
-
const pool = observePostgreSqlTimeouts(driver, new driver.Pool({
|
|
92
|
-
stream,
|
|
93
|
-
host: resource.host,
|
|
94
|
-
port: resource.port,
|
|
95
|
-
user: resource.user,
|
|
96
|
-
password: () => password,
|
|
97
|
-
database: resource.dbname,
|
|
98
|
-
ssl: sslConfig(resource),
|
|
99
|
-
max: 5,
|
|
100
|
-
connectionTimeoutMillis: 10_000,
|
|
101
|
-
idleTimeoutMillis: 30_000,
|
|
102
|
-
statement_timeout: 10_000,
|
|
103
|
-
}), () => warn('temper.database.query.timeout', 'PostgreSQL statement timed out.', { code: '57014' }));
|
|
104
|
-
// The error and its attached client stay out of the line: both can carry server text and login details.
|
|
105
|
-
pool.on('error', () => warn('temper.database.connection.error', 'An idle PostgreSQL connection closed.'));
|
|
106
|
-
return pool;
|
|
107
|
-
});
|
|
108
|
-
export const tunnelEnabled = (value) => Option.contains(value, 'websocket');
|
|
109
|
-
/** Outlasts the pool's 10 s statement timeout, so a query in flight when the scope closes can still finish. */
|
|
110
|
-
export const POOL_END_TIMEOUT = '15 seconds';
|
|
111
|
-
/**
|
|
112
|
-
* Ends the pool, waiting at most `timeout`. pg-pool's `end()` waits for every checked-out client, so a leaked
|
|
113
|
-
* `pool.connect()` would otherwise hold its scope open; past the bound the release logs a warning and returns.
|
|
114
|
-
*/
|
|
115
|
-
export const endPool = (pool, timeout = POOL_END_TIMEOUT) => Effect.promise(() => pool.end().catch(() => undefined)).pipe(Effect.timeoutOption(timeout), Effect.flatMap((ended) => Option.isSome(ended)
|
|
116
|
-
? Effect.void
|
|
117
|
-
: Effect.logWarning('A PostgreSQL pool did not end in time: a client was not released.').pipe(Effect.annotateLogs({ event: 'temper.database.pool.end.timeout' }))));
|
|
118
|
-
//# sourceMappingURL=PostgreSqlPool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlPool.js","sourceRoot":"","sources":["../src/PostgreSqlPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type pg from 'pg';
|
|
2
|
-
/** The `pg` classes the observer checks against; the caller passes the module it loaded. */
|
|
3
|
-
export type PgClasses = Pick<typeof pg, 'Client' | 'DatabaseError'>;
|
|
4
|
-
/** Calls `report` once per statement timeout on any connection of the pool, without changing query results. */
|
|
5
|
-
export declare const observePostgreSqlTimeouts: (driver: PgClasses, pool: pg.Pool, report: () => void) => pg.Pool;
|
|
6
|
-
//# sourceMappingURL=PostgreSqlTimeouts.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlTimeouts.d.ts","sourceRoot":"","sources":["../src/PostgreSqlTimeouts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,4FAA4F;AAC5F,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,GAAG,eAAe,CAAC,CAAC;AAEpE,+GAA+G;AAC/G,eAAO,MAAM,yBAAyB,WAAY,SAAS,QAAQ,EAAE,CAAC,IAAI,UAAU,MAAM,IAAI,KAAG,EAAE,CAAC,IAenG,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/** Calls `report` once per statement timeout on any connection of the pool, without changing query results. */
|
|
2
|
-
export const observePostgreSqlTimeouts = (driver, pool, report) => {
|
|
3
|
-
pool.on('connect', (client) => {
|
|
4
|
-
if (!(client instanceof driver.Client) || !client.connection)
|
|
5
|
-
return;
|
|
6
|
-
// Wire errors cover pool, checked-out client, and callback queries without changing their return values.
|
|
7
|
-
client.connection.on('errorMessage', (error) => {
|
|
8
|
-
if (error instanceof driver.DatabaseError &&
|
|
9
|
-
error.code === '57014' &&
|
|
10
|
-
error.message.includes('statement timeout')) {
|
|
11
|
-
report();
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
return pool;
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=PostgreSqlTimeouts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlTimeouts.js","sourceRoot":"","sources":["../src/PostgreSqlTimeouts.ts"],"names":[],"mappings":"AAKA,+GAA+G;AAC/G,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAiB,EAAE,IAAa,EAAE,MAAkB,EAAW,EAAE;IACzG,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QACrE,yGAAyG;QACzG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAY,EAAE,EAAE;YACpD,IACE,KAAK,YAAY,MAAM,CAAC,aAAa;gBACrC,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC3C,CAAC;gBACD,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Duplex } from 'node:stream';
|
|
2
|
-
/** Reads current runtime authorization; called once per physical connection, so a renewed token is used at once. */
|
|
3
|
-
export type TunnelAuthorization = () => Promise<{
|
|
4
|
-
readonly url: string;
|
|
5
|
-
readonly token: string;
|
|
6
|
-
}>;
|
|
7
|
-
/** A pg socket over the Resources-authenticated WebSocket tunnel; any failure ends the connection, never falls back to TCP. */
|
|
8
|
-
export declare class PostgreSqlTunnelStream extends Duplex {
|
|
9
|
-
private readonly authorize;
|
|
10
|
-
private transport;
|
|
11
|
-
private socket;
|
|
12
|
-
private referenced;
|
|
13
|
-
private closingCleanly;
|
|
14
|
-
constructor(authorize: TunnelAuthorization);
|
|
15
|
-
setNoDelay(): this;
|
|
16
|
-
setKeepAlive(): this;
|
|
17
|
-
ref(): this;
|
|
18
|
-
unref(): this;
|
|
19
|
-
connect(): this;
|
|
20
|
-
_read(): void;
|
|
21
|
-
_write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
22
|
-
_final(callback: (error?: Error | null) => void): void;
|
|
23
|
-
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=PostgreSqlTunnel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlTunnel.d.ts","sourceRoot":"","sources":["../src/PostgreSqlTunnel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,oHAAoH;AACpH,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIlG,+HAA+H;AAC/H,qBAAa,sBAAuB,SAAQ,MAAM;IAKpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJtC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,YAA6B,SAAS,EAAE,mBAAmB,EAE1D;IACD,UAAU,SAET;IACD,YAAY,SAEX;IACD,GAAG,SAIF;IACD,KAAK,SAIJ;IACD,OAAO,SA6CN;IACQ,KAAK,SAEb;IACQ,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,QAYjG;IACQ,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,QAIvD;IACQ,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,QAG9E;CACF"}
|
package/dist/PostgreSqlTunnel.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { Duplex } from 'node:stream';
|
|
2
|
-
import { createWebSocketStream, WebSocket } from 'ws';
|
|
3
|
-
const unavailable = () => new Error('Database tunnel disconnected. Retry the connection to Temper.');
|
|
4
|
-
/** A pg socket over the Resources-authenticated WebSocket tunnel; any failure ends the connection, never falls back to TCP. */
|
|
5
|
-
export class PostgreSqlTunnelStream extends Duplex {
|
|
6
|
-
authorize;
|
|
7
|
-
transport;
|
|
8
|
-
socket;
|
|
9
|
-
referenced = true;
|
|
10
|
-
closingCleanly = false;
|
|
11
|
-
constructor(authorize) {
|
|
12
|
-
super({ highWaterMark: 65_536 });
|
|
13
|
-
this.authorize = authorize;
|
|
14
|
-
}
|
|
15
|
-
setNoDelay() {
|
|
16
|
-
return this;
|
|
17
|
-
}
|
|
18
|
-
setKeepAlive() {
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
ref() {
|
|
22
|
-
this.referenced = true;
|
|
23
|
-
this.socket?.ref();
|
|
24
|
-
return this;
|
|
25
|
-
}
|
|
26
|
-
unref() {
|
|
27
|
-
this.referenced = false;
|
|
28
|
-
this.socket?.unref();
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
connect() {
|
|
32
|
-
void this.authorize()
|
|
33
|
-
.then(({ url, token }) => {
|
|
34
|
-
if (this.destroyed)
|
|
35
|
-
return;
|
|
36
|
-
const endpoint = new URL(url);
|
|
37
|
-
if (endpoint.protocol !== 'wss:' &&
|
|
38
|
-
!(endpoint.protocol === 'ws:' && ['127.0.0.1', 'localhost', '[::1]'].includes(endpoint.hostname)))
|
|
39
|
-
throw unavailable();
|
|
40
|
-
if (endpoint.username || endpoint.password || endpoint.search || endpoint.hash)
|
|
41
|
-
throw unavailable();
|
|
42
|
-
const websocket = new WebSocket(endpoint, {
|
|
43
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
44
|
-
handshakeTimeout: 10_000,
|
|
45
|
-
maxPayload: 65_536,
|
|
46
|
-
perMessageDeflate: false,
|
|
47
|
-
followRedirects: false,
|
|
48
|
-
finishRequest: (request) => {
|
|
49
|
-
request.once('socket', (socket) => {
|
|
50
|
-
this.socket = socket;
|
|
51
|
-
if (!this.referenced)
|
|
52
|
-
socket.unref();
|
|
53
|
-
});
|
|
54
|
-
request.end();
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
const stream = createWebSocketStream(websocket, { highWaterMark: 65_536 });
|
|
58
|
-
this.transport = stream;
|
|
59
|
-
stream.on('error', () => this.destroy(unavailable()));
|
|
60
|
-
stream.on('data', (data) => {
|
|
61
|
-
if (!this.push(data))
|
|
62
|
-
stream.pause();
|
|
63
|
-
});
|
|
64
|
-
stream.on('end', () => {
|
|
65
|
-
if (this.closingCleanly)
|
|
66
|
-
this.push(null);
|
|
67
|
-
else
|
|
68
|
-
this.destroy(unavailable());
|
|
69
|
-
});
|
|
70
|
-
stream.on('close', () => {
|
|
71
|
-
if (this.closingCleanly)
|
|
72
|
-
this.destroy();
|
|
73
|
-
else
|
|
74
|
-
this.destroy(unavailable());
|
|
75
|
-
});
|
|
76
|
-
websocket.once('open', () => {
|
|
77
|
-
if (!this.destroyed)
|
|
78
|
-
this.emit('connect');
|
|
79
|
-
});
|
|
80
|
-
})
|
|
81
|
-
.catch(() => this.destroy(unavailable()));
|
|
82
|
-
return this;
|
|
83
|
-
}
|
|
84
|
-
_read() {
|
|
85
|
-
this.transport?.resume();
|
|
86
|
-
}
|
|
87
|
-
_write(chunk, _encoding, callback) {
|
|
88
|
-
const stream = this.transport;
|
|
89
|
-
if (!stream)
|
|
90
|
-
return callback(unavailable());
|
|
91
|
-
let offset = 0;
|
|
92
|
-
const next = () => {
|
|
93
|
-
if (offset >= chunk.length)
|
|
94
|
-
return callback();
|
|
95
|
-
const end = Math.min(offset + 65_536, chunk.length);
|
|
96
|
-
const frame = chunk.subarray(offset, end);
|
|
97
|
-
offset = end;
|
|
98
|
-
stream.write(frame, (error) => (error ? callback(unavailable()) : next()));
|
|
99
|
-
};
|
|
100
|
-
next();
|
|
101
|
-
}
|
|
102
|
-
_final(callback) {
|
|
103
|
-
this.closingCleanly = true;
|
|
104
|
-
if (this.transport)
|
|
105
|
-
this.transport.end(callback);
|
|
106
|
-
else
|
|
107
|
-
callback();
|
|
108
|
-
}
|
|
109
|
-
_destroy(error, callback) {
|
|
110
|
-
this.transport?.destroy();
|
|
111
|
-
callback(error);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=PostgreSqlTunnel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlTunnel.js","sourceRoot":"","sources":["../src/PostgreSqlTunnel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAKtD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AAErG,+HAA+H;AAC/H,MAAM,OAAO,sBAAuB,SAAQ,MAAM;IAKnB,SAAS;IAJ9B,SAAS,CAAqB;IAC9B,MAAM,CAAqB;IAC3B,UAAU,GAAG,IAAI,CAAC;IAClB,cAAc,GAAG,KAAK,CAAC;IAC/B,YAA6B,SAA8B;QACzD,KAAK,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;yBADN,SAAS;IAEtC,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,YAAY;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,IAAI,CAAC,SAAS,EAAE;aAClB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;YACvB,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IACE,QAAQ,CAAC,QAAQ,KAAK,MAAM;gBAC5B,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAEjG,MAAM,WAAW,EAAE,CAAC;YACtB,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI;gBAAE,MAAM,WAAW,EAAE,CAAC;YACpG,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE;gBACxC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;gBAC7C,gBAAgB,EAAE,MAAM;gBACxB,UAAU,EAAE,MAAM;gBAClB,iBAAiB,EAAE,KAAK;gBACxB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE;oBACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;wBAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;wBACrB,IAAI,CAAC,IAAI,CAAC,UAAU;4BAAE,MAAM,CAAC,KAAK,EAAE,CAAC;oBACvC,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACvC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACpB,IAAI,IAAI,CAAC,cAAc;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;oBACpC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,IAAI,IAAI,CAAC,cAAc;oBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;oBACnC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC1B,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACQ,KAAK;QACZ,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IACQ,MAAM,CAAC,KAAa,EAAE,SAAyB,EAAE,QAAwC;QAChG,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO,QAAQ,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAoB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC;IACQ,MAAM,CAAC,QAAwC;QACtD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;YAC5C,QAAQ,EAAE,CAAC;IAClB,CAAC;IACQ,QAAQ,CAAC,KAAmB,EAAE,QAAwC;QAC7E,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;CACF"}
|