Skip to content

Commit db99dad

Browse files
committed
fix: database queue promise chaining
1 parent a34dfe6 commit db99dad

File tree

2 files changed

+34
-34
lines changed

2 files changed

+34
-34
lines changed

package/src/DatabaseQueue.ts

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,27 @@ export function closeDatabase(dbName: string) {
6262
databaseQueues.delete(dbName)
6363
}
6464

65-
export function queueOperationAsync<
66-
OperationCallback extends () => Promise<Result>,
67-
Result = void,
68-
>(dbName: string, callback: OperationCallback) {
65+
export function queueOperationAsync<Result>(
66+
dbName: string,
67+
callback: () => Promise<Result>,
68+
) {
6969
const databaseQueue = getDatabaseQueue(dbName)
7070

7171
return new Promise<Result>((resolve, reject) => {
72+
async function start() {
73+
try {
74+
const result = await callback()
75+
resolve(result)
76+
} catch (error) {
77+
reject(error)
78+
} finally {
79+
databaseQueue.inProgress = false
80+
startOperationAsync(dbName)
81+
}
82+
}
83+
7284
const operation: QueuedOperation = {
73-
start: async () => {
74-
try {
75-
const result = await callback()
76-
resolve(result)
77-
} catch (error) {
78-
reject(error)
79-
} finally {
80-
databaseQueue.inProgress = false
81-
startOperationAsync(dbName)
82-
}
83-
},
85+
start,
8486
}
8587

8688
databaseQueue.queue.push(operation)
@@ -99,7 +101,9 @@ function startOperationAsync(dbName: string) {
99101
queue.inProgress = true
100102

101103
const operation = queue.queue.shift()!
102-
setImmediate(operation.start)
104+
setImmediate(() => {
105+
operation.start()
106+
})
103107
}
104108

105109
export function startOperationSync<

package/src/operations/transaction.ts

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { HybridNitroSQLite } from '../nitro'
21
import { queueOperationAsync, throwIfDatabaseIsNotOpen } from '../DatabaseQueue'
32
import type {
43
QueryResult,
@@ -9,20 +8,19 @@ import type {
98
import { execute, executeAsync } from './execute'
109
import NitroSQLiteError from '../NitroSQLiteError'
1110

12-
export const transaction = (
11+
export const transaction = async <Result = void>(
1312
dbName: string,
14-
fn: (tx: Transaction) => Promise<void> | void,
13+
transactionCallback: (tx: Transaction) => Promise<Result>,
1514
isExclusive = false,
16-
): Promise<void> => {
15+
) => {
1716
throwIfDatabaseIsNotOpen(dbName)
1817

1918
let isFinalized = false
2019

21-
// Local transaction context object implementation
22-
const executeOnTransaction = <Data extends QueryResultRow = never>(
20+
const executeOnTransaction = <Row extends QueryResultRow = never>(
2321
query: string,
2422
params?: SQLiteQueryParams,
25-
): QueryResult<Data> => {
23+
): QueryResult<Row> => {
2624
if (isFinalized) {
2725
throw new NitroSQLiteError(
2826
`Cannot execute query on finalized transaction: ${dbName}`,
@@ -31,10 +29,10 @@ export const transaction = (
3129
return execute(dbName, query, params)
3230
}
3331

34-
const executeAsyncOnTransaction = <Data extends QueryResultRow = never>(
32+
const executeAsyncOnTransaction = <Row extends QueryResultRow = never>(
3533
query: string,
3634
params?: SQLiteQueryParams,
37-
): Promise<QueryResult<Data>> => {
35+
): Promise<QueryResult<Row>> => {
3836
if (isFinalized) {
3937
throw new NitroSQLiteError(
4038
`Cannot execute query on finalized transaction: ${dbName}`,
@@ -49,9 +47,8 @@ export const transaction = (
4947
`Cannot execute commit on finalized transaction: ${dbName}`,
5048
)
5149
}
52-
const result = HybridNitroSQLite.execute(dbName, 'COMMIT')
5350
isFinalized = true
54-
return result
51+
return execute(dbName, 'COMMIT')
5552
}
5653

5754
const rollback = () => {
@@ -60,27 +57,28 @@ export const transaction = (
6057
`Cannot execute rollback on finalized transaction: ${dbName}`,
6158
)
6259
}
63-
const result = HybridNitroSQLite.execute(dbName, 'ROLLBACK')
6460
isFinalized = true
65-
return result
61+
return execute(dbName, 'ROLLBACK')
6662
}
6763

6864
try {
69-
return queueOperationAsync(dbName, async () => {
65+
return await queueOperationAsync(dbName, async () => {
7066
try {
71-
await HybridNitroSQLite.executeAsync(
67+
await executeAsync(
7268
dbName,
7369
isExclusive ? 'BEGIN EXCLUSIVE TRANSACTION' : 'BEGIN TRANSACTION',
7470
)
7571

76-
await fn({
72+
const result = await transactionCallback({
7773
commit,
7874
execute: executeOnTransaction,
7975
executeAsync: executeAsyncOnTransaction,
8076
rollback,
8177
})
8278

8379
if (!isFinalized) commit()
80+
81+
return result
8482
} catch (executionError) {
8583
if (!isFinalized) {
8684
try {
@@ -91,8 +89,6 @@ export const transaction = (
9189
}
9290

9391
throw executionError
94-
} finally {
95-
isFinalized = false
9692
}
9793
})
9894
} catch (error) {

0 commit comments

Comments
 (0)