Skip to content

Commit 2fd330d

Browse files
committed
refactor: storage drivers
1 parent 791b485 commit 2fd330d

File tree

9 files changed

+311
-394
lines changed

9 files changed

+311
-394
lines changed

lib/db/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export async function findKeyMatch(
106106
.selectFrom('cache_keys')
107107
.where('key', 'like', `${args.key}%`)
108108
.where('version', '=', args.version)
109-
.orderBy('cache_keys.updated_at desc')
109+
.orderBy('cache_keys.updated_at', 'desc')
110110
.selectAll()
111111
.executeTakeFirst()
112112

@@ -124,7 +124,7 @@ export async function findKeyMatch(
124124
const exactMatch = await db
125125
.selectFrom('cache_keys')
126126
.where('id', '=', getCacheKeyId(key, args.version))
127-
.orderBy('cache_keys.updated_at desc')
127+
.orderBy('cache_keys.updated_at', 'desc')
128128
.selectAll()
129129
.executeTakeFirst()
130130
if (exactMatch) {
@@ -137,7 +137,7 @@ export async function findKeyMatch(
137137
.selectFrom('cache_keys')
138138
.where('version', '=', args.version)
139139
.where('key', 'like', `${key}%`)
140-
.orderBy('cache_keys.updated_at desc')
140+
.orderBy('cache_keys.updated_at', 'desc')
141141
.selectAll()
142142
.executeTakeFirst()
143143

lib/storage/defineStorageDriver.ts

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

lib/storage/drivers/filesystem.ts

Lines changed: 55 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,81 @@
1+
import type { StorageDriver } from '~/lib/storage/storage-driver'
12
import { createReadStream, createWriteStream, promises as fs } from 'node:fs'
23
import path from 'node:path'
4+
35
import { pipeline } from 'node:stream/promises'
46

57
import { z } from 'zod'
6-
7-
import { parseEnv, StorageDriver } from '~/lib/storage/defineStorageDriver'
8+
import { BASE_FOLDER, parseEnv, UPLOAD_FOLDER } from '~/lib/storage/storage-driver'
89
import { createTempDir } from '~/lib/utils'
910

10-
export class FilesystemStorageDriver extends StorageDriver {
11-
constructor(baseFolderPrefix?: string) {
12-
super(baseFolderPrefix)
13-
}
14-
15-
static async create() {
11+
export const FilesystemStorageDriver = {
12+
async create() {
1613
const options = parseEnv(
1714
z.object({
1815
STORAGE_FILESYSTEM_PATH: z.string().default('.data/storage/filesystem'),
1916
}),
2017
)
2118

22-
const baseFolderPrefix = options.STORAGE_FILESYSTEM_PATH
23-
await fs.mkdir(path.join(baseFolderPrefix, StorageDriver.baseFolder), {
19+
const rootFolder = options.STORAGE_FILESYSTEM_PATH
20+
await fs.mkdir(path.join(rootFolder, BASE_FOLDER), {
21+
recursive: true,
22+
})
23+
await fs.mkdir(path.join(rootFolder, BASE_FOLDER, UPLOAD_FOLDER), {
2424
recursive: true,
2525
})
26-
await fs.mkdir(
27-
path.join(baseFolderPrefix, StorageDriver.baseFolder, StorageDriver.uploadFolder),
28-
{
29-
recursive: true,
30-
},
31-
)
32-
33-
return new FilesystemStorageDriver(baseFolderPrefix)
34-
}
3526

36-
async uploadPart(opts: { uploadId: string; partNumber: number; data: ReadableStream }) {
37-
const folderPath = this.getUploadFolderPrefix(opts.uploadId)
38-
await fs.mkdir(folderPath, { recursive: true })
39-
const writeStream = await createWriteStream(
40-
this.getUploadPartObjectName({
41-
uploadId: opts.uploadId,
42-
partNumber: opts.partNumber,
43-
}),
44-
)
27+
return <StorageDriver>{
28+
async uploadPart(opts) {
29+
const folderPath = path.join(rootFolder, BASE_FOLDER, UPLOAD_FOLDER, opts.uploadId)
30+
await fs.mkdir(folderPath, { recursive: true })
31+
const writeStream = await createWriteStream(
32+
path.join(folderPath, `part_${opts.partNumber}`),
33+
)
34+
await pipeline(opts.data, writeStream)
35+
},
4536

46-
await pipeline(opts.data, writeStream)
47-
}
37+
async completeMultipartUpload(opts) {
38+
const tempDir = await createTempDir()
39+
const outputTempFilePath = path.join(tempDir, 'output')
4840

49-
async completeMultipartUpload(opts: {
50-
finalOutputObjectName: string
51-
uploadId: string
52-
partNumbers: number[]
53-
}) {
54-
const tempDir = await createTempDir()
55-
const outputTempFilePath = path.join(tempDir, 'output')
41+
for (const partNumber of opts.partNumbers) {
42+
const buffer = await fs.readFile(
43+
path.join(rootFolder, BASE_FOLDER, UPLOAD_FOLDER, opts.uploadId, `part_${partNumber}`),
44+
)
5645

57-
for (const partNumber of opts.partNumbers) {
58-
const buffer = await fs.readFile(
59-
this.getUploadPartObjectName({
60-
uploadId: opts.uploadId,
61-
partNumber,
62-
}),
63-
)
46+
await fs.appendFile(outputTempFilePath, buffer)
47+
}
6448

65-
await fs.appendFile(outputTempFilePath, buffer)
66-
}
49+
await fs.copyFile(
50+
outputTempFilePath,
51+
path.join(rootFolder, BASE_FOLDER, opts.cacheFileName),
52+
)
53+
await fs.rm(outputTempFilePath)
6754

68-
await fs.copyFile(outputTempFilePath, this.addBaseFolderPrefix(opts.finalOutputObjectName))
69-
await fs.rm(outputTempFilePath)
55+
await Promise.all([
56+
this.cleanupMultipartUpload(opts.uploadId),
57+
fs.rm(outputTempFilePath, { force: true }),
58+
])
59+
},
7060

71-
await Promise.all([
72-
this.cleanupMultipartUpload(opts.uploadId),
73-
fs.rm(outputTempFilePath, { force: true }),
74-
])
75-
}
61+
async cleanupMultipartUpload(uploadId) {
62+
await fs.rm(path.join(rootFolder, BASE_FOLDER, UPLOAD_FOLDER, uploadId), {
63+
force: true,
64+
recursive: true,
65+
})
66+
},
7667

77-
async cleanupMultipartUpload(uploadId: string) {
78-
await fs.rm(this.getUploadFolderPrefix(uploadId), {
79-
force: true,
80-
recursive: true,
81-
})
82-
}
68+
async delete(cacheFileNames): Promise<void> {
69+
for (const cacheFileName of cacheFileNames) {
70+
await fs.rm(path.join(rootFolder, BASE_FOLDER, cacheFileName), {
71+
force: true,
72+
})
73+
}
74+
},
8375

84-
async delete(objectNames: string[]): Promise<void> {
85-
for (const name of objectNames) {
86-
await fs.rm(this.addBaseFolderPrefix(name), {
87-
force: true,
88-
})
76+
async createReadStream(cacheFileName) {
77+
return createReadStream(path.join(rootFolder, BASE_FOLDER, cacheFileName))
78+
},
8979
}
90-
}
91-
92-
async createReadStream(objectName: string) {
93-
return createReadStream(this.addBaseFolderPrefix(objectName))
94-
}
95-
96-
createDownloadUrl: undefined
80+
},
9781
}

0 commit comments

Comments
 (0)