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
}