preserve modified-time uploading (when specified)

Massimo Melina committed Jan 31, 2025 at 00:02 UTC 743537dc9c38dd58d30e1cbdff8a1f1f33d271f1
1 file changed +7 -3
src/upload.ts
+7 -3
@@ -23,12 +23,13 @@ import { rename, rm } from 'fs/promises'
23 import { expiringCache } from './expiringCache'
24 import { onProcessExit } from './first'
25 import { once, Transform } from 'stream'
26 +import { utimes } from 'node:fs/promises'
27
28 export const deleteUnfinishedUploadsAfter = defineConfig<undefined|number>('delete_unfinished_uploads_after', 86_400)
29 export const minAvailableMb = defineConfig('min_available_mb', 100)
30 export const dontOverwriteUploading = defineConfig('dont_overwrite_uploading', true)
31
31 -const waitingToBeDeleted: Record<string, { timeout: Timeout, expires: number, mtimeMs: any, giveBack: any }> = {}
32 +const waitingToBeDeleted: Record<string, { timeout: Timeout, expires: number, mtimeMs?: number, giveBack?: any }> = {}
33 onProcessExit(() => {
34 if (!Object.keys(waitingToBeDeleted).length) return
35 console.log("removing unfinished uploads")
@@ -209,13 +210,16 @@ export function uploadWriter(base: VfsNode, baseUri: string, path: string, ctx:
210 }
211 try {
212 await rename(tempName, dest)
213 + const t = Number(ctx.query.giveBack) // we know giveBack contains lastModified in ms
214 + if (t) // so we use it to touch the file
215 + await utimes(dest, Date.now() / 1000, t / 1000)
216 cancelDeletion(tempName) // not necessary, as deletion's failure is silent, but still
217 if (isWritingSecondFile) { // we've been using altTempName, but now we're done, so we can delete firstTempName
218 cancelDeletion(firstTempName)
219 await rm(firstTempName) // wait, so the client can count on the temp-file being gone
220 }
221 ctx.state.uploadDestinationPath = dest
218 - setUploadMeta(dest, ctx)
222 + void setUploadMeta(dest, ctx)
223 if (ctx.query.comment)
224 void setCommentFor(dest, String(ctx.query.comment))
225 obj.uri = enforceFinal('/', baseUri) + pathEncode(basename(dest))
@@ -225,7 +229,7 @@ export function uploadWriter(base: VfsNode, baseUri: string, path: string, ctx:
229 cb(obj)
230 }
231 catch (err: any) {
228 - setUploadMeta(tempName, ctx)
232 + void setUploadMeta(tempName, ctx)
233 console.error("couldn't rename temp to", dest, String(err))
234 }
235 }