Skip to content

Commit 20a12da

Browse files
chore: cleanup node14 unneeded code (#407)
Remove no longer needed workaround node14 code paths. Node14 support was removed in #403
1 parent c2c1cb7 commit 20a12da

File tree

8 files changed

+137
-276
lines changed

8 files changed

+137
-276
lines changed

.npmrc

Lines changed: 0 additions & 1 deletion
This file was deleted.

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
"@sequelize/core": "^7.0.0-alpha.29",
6161
"@types/node": "^22.0.0",
6262
"@types/pg": "^8.10.1",
63-
"@types/semver": "^7.5.0",
6463
"@types/tap": "^18.0.0",
6564
"@types/tedious": "^4.0.9",
6665
"@typescript-eslint/eslint-plugin": "^7.0.0",
@@ -71,7 +70,6 @@
7170
"mysql2": "^3.2.0",
7271
"nock": "^13.3.0",
7372
"pg": "^8.10.0",
74-
"semver": "^7.5.1",
7573
"tap": "^21.0.0",
7674
"tedious": "^16.1.0",
7775
"typeorm": "^0.3.19",

scripts/tap16-adapter.js

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/crypto.ts

Lines changed: 18 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -18,54 +18,6 @@ import {SslCert} from './ssl-cert';
1818
import {cryptoModule} from './node-crypto';
1919
import {CloudSQLConnectorError} from './errors';
2020

21-
// The following is a fallback certificate parser for node14 to work around
22-
// its lack of support to the X509Certificate class parser, this block of code
23-
// can be safely removed once node14 is no longer supported, along with any
24-
// `node14ParseCert` call and its unit tests.
25-
// --- node@14 cert parse fallback start
26-
import net from 'node:net';
27-
import tls from 'node:tls';
28-
29-
const node14ParseCert = (cert: string): SslCert => {
30-
const isPeerCertificate = (
31-
obj: object | tls.PeerCertificate
32-
): obj is tls.PeerCertificate =>
33-
(obj as tls.PeerCertificate).valid_to !== undefined;
34-
35-
let socket;
36-
let parsed;
37-
try {
38-
socket = new tls.TLSSocket(new net.Socket(), {
39-
secureContext: tls.createSecureContext({cert}),
40-
});
41-
parsed = socket.getCertificate();
42-
} catch (err: unknown) {
43-
throw new CloudSQLConnectorError({
44-
message: 'Failed to parse as X.509 certificate.',
45-
code: 'EPARSESQLADMINEPH',
46-
errors: [err as Error],
47-
});
48-
}
49-
50-
if (parsed && isPeerCertificate(parsed)) {
51-
const expirationTime = parsed.valid_to;
52-
socket.destroy();
53-
socket = undefined;
54-
parsed = undefined;
55-
56-
return {
57-
cert,
58-
expirationTime,
59-
};
60-
}
61-
/* c8 ignore next 5 */
62-
throw new CloudSQLConnectorError({
63-
message: 'Could not read ephemeral certificate.',
64-
code: 'EPARSESQLADMINEPH',
65-
});
66-
};
67-
// --- node@14 cert parse fallback end
68-
6921
export async function generateKeys(): Promise<RSAKeys> {
7022
const crypto = await cryptoModule();
7123
const keygen = promisify(crypto.generateKeyPair);
@@ -90,27 +42,24 @@ export async function generateKeys(): Promise<RSAKeys> {
9042

9143
export async function parseCert(cert: string): Promise<SslCert> {
9244
const {X509Certificate} = await cryptoModule();
93-
if (X509Certificate) {
94-
try {
95-
const parsed = new X509Certificate(cert);
96-
if (parsed && parsed.validTo) {
97-
return {
98-
cert,
99-
expirationTime: parsed.validTo,
100-
};
101-
}
102-
103-
throw new CloudSQLConnectorError({
104-
message: 'Could not read ephemeral certificate.',
105-
code: 'EPARSESQLADMINEPH',
106-
});
107-
} catch (err: unknown) {
108-
throw new CloudSQLConnectorError({
109-
message: 'Failed to parse as X.509 certificate.',
110-
code: 'EPARSESQLADMINEPH',
111-
errors: [err as Error],
112-
});
45+
try {
46+
const parsed = new X509Certificate(cert);
47+
if (parsed && parsed.validTo) {
48+
return {
49+
cert,
50+
expirationTime: parsed.validTo,
51+
};
11352
}
53+
54+
throw new CloudSQLConnectorError({
55+
message: 'Could not read ephemeral certificate.',
56+
code: 'EPARSESQLADMINEPH',
57+
});
58+
} catch (err: unknown) {
59+
throw new CloudSQLConnectorError({
60+
message: 'Failed to parse as X.509 certificate.',
61+
code: 'EPARSESQLADMINEPH',
62+
errors: [err as Error],
63+
});
11464
}
115-
return node14ParseCert(cert);
11665
}

system-test/tedious-connect.cjs

Lines changed: 49 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,69 +13,62 @@
1313
// limitations under the License.
1414

1515
const t = require('tap');
16-
const semver = require('semver');
1716
const {Connector} = require('@google-cloud/cloud-sql-connector');
17+
const {Connection, Request} = require('tedious');
1818

19-
t.test(
20-
'open connection and run basic sqlserver commands',
21-
// the connector-supported versions of tedious do not support node14
22-
{skip: semver.lt(process.versions.node, '16.0.0')},
23-
async t => {
24-
// lazy-load tedious here in order to allow for skipping node14
25-
const {Connection, Request} = require('tedious');
26-
const connector = new Connector();
27-
const clientOpts = await connector.getTediousOptions({
28-
instanceConnectionName: process.env.SQLSERVER_CONNECTION_NAME,
29-
ipType: 'PUBLIC',
30-
});
31-
const connection = new Connection({
32-
server: '0.0.0.0',
33-
authentication: {
34-
type: 'default',
35-
options: {
36-
userName: process.env.SQLSERVER_USER,
37-
password: process.env.SQLSERVER_PASS,
38-
},
39-
},
19+
t.test('open connection and run basic sqlserver commands', async t => {
20+
const connector = new Connector();
21+
const clientOpts = await connector.getTediousOptions({
22+
instanceConnectionName: process.env.SQLSERVER_CONNECTION_NAME,
23+
ipType: 'PUBLIC',
24+
});
25+
const connection = new Connection({
26+
server: '0.0.0.0',
27+
authentication: {
28+
type: 'default',
4029
options: {
41-
...clientOpts,
42-
port: 9999,
43-
database: process.env.SQLSERVER_DB,
30+
userName: process.env.SQLSERVER_USER,
31+
password: process.env.SQLSERVER_PASS,
4432
},
45-
});
33+
},
34+
options: {
35+
...clientOpts,
36+
port: 9999,
37+
database: process.env.SQLSERVER_DB,
38+
},
39+
});
4640

47-
await new Promise((res, rej) => {
48-
connection.connect(err => {
49-
if (err) {
50-
return rej(err);
51-
}
52-
res();
53-
});
41+
await new Promise((res, rej) => {
42+
connection.connect(err => {
43+
if (err) {
44+
return rej(err);
45+
}
46+
res();
5447
});
48+
});
5549

56-
const res = await new Promise((res, rej) => {
57-
let result;
58-
const req = new Request('SELECT GETUTCDATE()', err => {
59-
if (err) {
60-
throw err;
61-
}
62-
});
63-
req.on('error', err => {
64-
rej(err);
65-
});
66-
req.on('row', columns => {
67-
result = columns;
68-
});
69-
req.on('requestCompleted', () => {
70-
res(result);
71-
});
72-
connection.execSql(req);
50+
const res = await new Promise((res, rej) => {
51+
let result;
52+
const req = new Request('SELECT GETUTCDATE()', err => {
53+
if (err) {
54+
throw err;
55+
}
56+
});
57+
req.on('error', err => {
58+
rej(err);
59+
});
60+
req.on('row', columns => {
61+
result = columns;
62+
});
63+
req.on('requestCompleted', () => {
64+
res(result);
7365
});
66+
connection.execSql(req);
67+
});
7468

75-
const [{value: utcDateResult}] = res;
76-
t.ok(utcDateResult.getTime(), 'should have valid returned date object');
69+
const [{value: utcDateResult}] = res;
70+
t.ok(utcDateResult.getTime(), 'should have valid returned date object');
7771

78-
connection.close();
79-
connector.close();
80-
}
81-
);
72+
connection.close();
73+
connector.close();
74+
});

system-test/tedious-connect.mjs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,14 @@
1313
// limitations under the License.
1414

1515
import t from 'tap';
16-
import semver from 'semver';
1716
import {Connector} from '@google-cloud/cloud-sql-connector';
17+
import {Connection, Request} from 'tedious';
1818

19-
t.test(
20-
'open connection and run basic sqlserver commands',
21-
// the connector-supported versions of tedious do not support node14
22-
{skip: semver.lt(process.versions.node, '16.0.0')},
23-
async t => {
24-
// dynamically load tedious in order to allow for skipping node14
25-
const {Connection, Request} = await import('tedious');
19+
t.test('open connection and run basic sqlserver commands', async t => {
2620
const connector = new Connector();
2721
const clientOpts = await connector.getTediousOptions({
2822
instanceConnectionName: process.env.SQLSERVER_CONNECTION_NAME,
29-
ipType: 'PUBLIC'
23+
ipType: 'PUBLIC',
3024
});
3125
const connection = new Connection({
3226
server: '0.0.0.0',
@@ -42,29 +36,35 @@ t.test(
4236
port: 9999,
4337
database: process.env.SQLSERVER_DB,
4438
},
45-
})
39+
});
4640

4741
await new Promise((res, rej) => {
4842
connection.connect(err => {
4943
if (err) {
50-
return rej(err)
44+
return rej(err);
5145
}
52-
res()
53-
})
54-
})
46+
res();
47+
});
48+
});
5549

5650
const res = await new Promise((res, rej) => {
5751
let result;
58-
const req = new Request('SELECT GETUTCDATE()', (err) => {
52+
const req = new Request('SELECT GETUTCDATE()', err => {
5953
if (err) {
6054
throw err;
6155
}
62-
})
63-
req.on('error', (err) => { rej(err); });
64-
req.on('row', (columns) => { result = columns; });
65-
req.on('requestCompleted', () => { res(result); });
56+
});
57+
req.on('error', err => {
58+
rej(err);
59+
});
60+
req.on('row', columns => {
61+
result = columns;
62+
});
63+
req.on('requestCompleted', () => {
64+
res(result);
65+
});
6666
connection.execSql(req);
67-
})
67+
});
6868

6969
const [{value: utcDateResult}] = res;
7070
t.ok(utcDateResult.getTime(), 'should have valid returned date object');

0 commit comments

Comments
 (0)