Skip to content

Commit 6b01e1c

Browse files
committed
fix: knex driver throwing an error when quickly disconnecting
1 parent c932ac5 commit 6b01e1c

5 files changed

Lines changed: 34 additions & 12 deletions

File tree

.changeset/some-pumas-admire.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'bentocache': patch
3+
---
4+
5+
Fix knex driver throwing an error when quickly disconnecting from the database after application start. See https://github.com/adonisjs/cache/issues/12#issuecomment-2791372837

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ yarn-error.log
2525
dist
2626
.todo.md
2727
tmp
28+
simulator/public/assets

packages/bentocache/src/drivers/database/database.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { asyncNoop, once } from '@julr/utils/functions'
2+
13
import { resolveTtl } from '../../helpers.js'
24
import { BaseDriver } from '../base_driver.js'
35
import type { DatabaseConfig, CacheDriver, DatabaseAdapter } from '../../types/main.js'
@@ -16,9 +18,9 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
1618
#adapter: DatabaseAdapter
1719

1820
/**
19-
* A promise that resolves when the table is created
21+
* Initialize by creating the table
2022
*/
21-
#initialized: Promise<void>
23+
#initializer: () => Promise<any>
2224

2325
/**
2426
* Pruning interval
@@ -30,16 +32,16 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
3032
this.#adapter = adapter
3133

3234
if (isNamespace) {
33-
this.#initialized = Promise.resolve()
35+
this.#initializer = asyncNoop
3436
return
3537
}
3638

3739
this.#adapter.setTableName(config.tableName || 'bentocache')
3840

3941
if (config.autoCreateTable !== false) {
40-
this.#initialized = this.#adapter.createTableIfNotExists()
42+
this.#initializer = once(async () => await this.#adapter.createTableIfNotExists())
4143
} else {
42-
this.#initialized = Promise.resolve()
44+
this.#initializer = asyncNoop
4345
}
4446

4547
if (config.pruneInterval === false) return
@@ -52,7 +54,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
5254
*/
5355
#startPruneInterval(interval: number) {
5456
this.#pruneInterval = setInterval(async () => {
55-
await this.#initialized
57+
await this.#initializer()
5658
await this.#adapter
5759
.pruneExpiredEntries()
5860
.catch((err) => console.error('[bentocache] failed to prune expired entries', err))
@@ -83,7 +85,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
8385
* Get a value from the cache
8486
*/
8587
async get(key: string) {
86-
await this.#initialized
88+
await this.#initializer()
8789

8890
const result = await this.#adapter.get(this.getItemKey(key))
8991
if (!result) return
@@ -113,7 +115,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
113115
* Returns true if the value was set, false otherwise
114116
*/
115117
async set(key: string, value: any, ttl?: number) {
116-
await this.#initialized
118+
await this.#initializer()
117119
await this.#adapter.set({
118120
key: this.getItemKey(key),
119121
value,
@@ -127,7 +129,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
127129
* Remove all items from the cache
128130
*/
129131
async clear() {
130-
await this.#initialized
132+
await this.#initializer()
131133

132134
await this.#adapter.clear(this.prefix)
133135
}
@@ -137,7 +139,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
137139
* Returns true if the key was deleted, false otherwise
138140
*/
139141
async delete(key: string) {
140-
await this.#initialized
142+
await this.#initializer()
141143
return this.#adapter.delete(this.getItemKey(key))
142144
}
143145

@@ -146,7 +148,7 @@ export class DatabaseDriver extends BaseDriver implements CacheDriver<true> {
146148
*/
147149
async deleteMany(keys: string[]) {
148150
if (keys.length === 0) return true
149-
await this.#initialized
151+
await this.#initializer()
150152

151153
keys = keys.map((key) => this.getItemKey(key))
152154
const result = await this.#adapter.deleteMany(keys)

packages/bentocache/src/drivers/memory.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ export class MemoryDriver extends BaseDriver implements L1CacheDriver {
8989
* Returns true if the value was set, false otherwise
9090
*/
9191
set(key: string, value: string, ttl?: number) {
92-
console.log('set', key, value, ttl)
9392
this.#cache.set(this.getItemKey(key), value, { ttl })
9493
return true
9594
}

packages/bentocache/tests/drivers/knex/mysql.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import knex from 'knex'
22
import { test } from '@japa/runner'
3+
import { sleep } from '@julr/utils/misc'
34

45
import { createKnexStore } from './helpers.js'
56
import { registerCacheDriverTestSuite } from '../../helpers/driver_test_suite.js'
@@ -18,4 +19,18 @@ test.group('Knex | MySQL driver', (group) => {
1819
return createKnexStore({ connection: db, prefix: 'japa', ...options })
1920
},
2021
})
22+
23+
test('should not throw error when disconnecting immediately', async () => {
24+
const db = knex({
25+
client: 'mysql2',
26+
connection: { user: 'root', password: 'root', database: 'mysql', port: 3306 },
27+
})
28+
29+
const store = createKnexStore({ connection: db, prefix: 'japa' })
30+
31+
await store.disconnect()
32+
await sleep(1000)
33+
await store.disconnect()
34+
await db.destroy()
35+
})
2136
})

0 commit comments

Comments
 (0)