Skip to content

Commit

Permalink
fix(datasource-sql): fix worker crash on authentication testing (#736)
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaud-moncel authored Jun 20, 2023
1 parent c81cf61 commit e81f101
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
18 changes: 18 additions & 0 deletions packages/datasource-sql/src/connection/connection-tester.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Sequelize } from 'sequelize';

import { DatabaseConnectError } from './errors';

export default async function testConnectionWithTimeOut(
sequelize: Sequelize,
databaseUri: string,
timeout = 10000,
) {
// Test connection. If this doesn't resolve after 10s, throw a timeout error
const timeoutPromise = new Promise(resolve => {
setTimeout(resolve, timeout);
}).then(() =>
Promise.reject(new DatabaseConnectError('Connection to database timed out', databaseUri)),
);

await Promise.race([sequelize.authenticate(), timeoutPromise]);
}
4 changes: 3 additions & 1 deletion packages/datasource-sql/src/connection/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Sequelize } from 'sequelize';

import ConnectionOptions from './connection-options';
import testConnectionWithTimeOut from './connection-tester';
import handleErrors from './handle-errors';
import ReverseProxy from './services/reverse-proxy';
import SequelizeFactory from './services/sequelize-factory';
Expand All @@ -27,7 +28,8 @@ export default async function connect(options: ConnectionOptions): Promise<Seque
if (tcpServer) sequelizeFactory.onClose(tcpServer.closeListener.bind(tcpServer));

sequelize = sequelizeFactory.build(await options.buildSequelizeCtorOptions());
await sequelize.authenticate(); // Test connection

await testConnectionWithTimeOut(sequelize, options.debugDatabaseUri);

return sequelize;
} catch (e) {
Expand Down
40 changes: 40 additions & 0 deletions packages/datasource-sql/test/connection/connection-tester.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { Sequelize } from 'sequelize';

import testConnectionWithTimeOut from '../../src/connection/connection-tester';
import { DatabaseConnectError } from '../../src/connection/errors';

describe('testConnectionWithTimeOut', () => {
it('should time out', async () => {
jest.useFakeTimers();

const sequelize = {
authenticate: () =>
new Promise(resolve => {
setTimeout(resolve, 4000);
}),
};

const promise = testConnectionWithTimeOut(sequelize as unknown as Sequelize, 'a db URI', 3000);

jest.advanceTimersByTime(3000);

await expect(promise).rejects.toThrow(DatabaseConnectError);
});

it('should pass before 3s', async () => {
jest.useFakeTimers();

const sequelize = {
authenticate: () =>
new Promise(resolve => {
setTimeout(resolve, 2000);
}),
};

const promise = testConnectionWithTimeOut(sequelize as unknown as Sequelize, 'a db URI', 3000);

jest.advanceTimersByTime(2000);

await expect(promise).resolves.not.toThrow();
});
});

0 comments on commit e81f101

Please sign in to comment.