Girish Ramakrishnan
b16b57f38b
rsync: throttle log messages during download
2026-03-12 13:47:26 +05:30
Girish Ramakrishnan
94bc52a0c3
rsync: typo
2026-03-04 20:48:00 +05:30
Girish Ramakrishnan
99168157fc
integrity: size is not a function
2026-03-03 20:24:26 +05:30
Girish Ramakrishnan
3b3e606573
integrity: better log messages
2026-03-03 16:13:44 +05:30
Girish Ramakrishnan
4d3e9dc49b
Fix shadow of pipeline variable
2026-02-18 07:58:47 +01:00
Girish Ramakrishnan
601e787500
rsync: fix integrity check
2026-02-15 23:17:23 +01:00
Girish Ramakrishnan
b5a1554631
Fix various linter errors
2026-02-15 19:37:30 +01:00
Girish Ramakrishnan
e9f96593c3
reorder functions for no-use-before-define
2026-02-14 16:34:34 +01:00
Girish Ramakrishnan
36aa641cb9
migrate to "export default"
...
also, set no-use-before-define in linter
2026-02-14 15:43:24 +01:00
Girish Ramakrishnan
96dc79cfe6
Migrate codebase from CommonJS to ES Modules
...
- Convert all require()/module.exports to import/export across 260+ files
- Add "type": "module" to package.json to enable ESM by default
- Add migrations/package.json with "type": "commonjs" to keep db-migrate compatible
- Convert eslint.config.js to ESM with sourceType: "module"
- Replace __dirname/__filename with import.meta.dirname/import.meta.filename
- Replace require.main === module with process.argv[1] === import.meta.filename
- Remove 'use strict' directives (implicit in ESM)
- Convert dynamic require() in switch statements to static import lookup maps
(dns.js, domains.js, backupformats.js, backupsites.js, network.js)
- Extract self-referencing exports.CONSTANT patterns into standalone const
declarations (apps.js, services.js, locks.js, users.js, mail.js, etc.)
- Lazify SERVICES object in services.js to avoid circular dependency TDZ issues
- Add clearMailQueue() to mailer.js for ESM-safe queue clearing in tests
- Add _setMockApp() to ldapserver.js for ESM-safe test mocking
- Add _setMockResolve() wrapper to dig.js for ESM-safe DNS mocking in tests
- Convert backupupload.js to use dynamic imports so --check exits before
loading the module graph (which requires BOX_ENV)
- Update check-install to use ESM import for infra_version.js
- Convert scripts/ (hotfix, release, remote_hotfix.js, find-unused-translations)
- All 1315 tests passing
Migration stats (AI-assisted using Cursor with Claude):
- Wall clock time: ~3-4 hours
- Assistant completions: ~80-100
- Estimated token usage: ~1-2M tokens
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-02-14 15:11:45 +01:00
Girish Ramakrishnan
5276321ade
integrity: add integrity check fields and initial UI
2026-02-08 23:26:57 +01:00
Girish Ramakrishnan
42cefd56eb
Fix uploader API to handle write stream errors
...
When the upload is aborted/abandoed because the source file is missing,
the write stream is never destroyed. This dangling write stream can
later error and cause a crash.
Instead, create the write stream on demand and nearer to pipeline() to
make sure we do 'error' handling.
2026-01-20 22:26:08 +01:00
Girish Ramakrishnan
9e82839fb7
rsync: bump empty dir limit to 80k
2025-11-24 12:06:52 +01:00
Girish Ramakrishnan
e106dcd76a
storage: pass limits object to backend
2025-11-14 13:18:21 +01:00
Girish Ramakrishnan
07732310c1
backuptask: track copy and upload statistics
2025-10-20 14:09:12 +02:00
Girish Ramakrishnan
10cf8f1d0e
rsync: integrity fixes
2025-10-09 00:23:44 +02:00
Girish Ramakrishnan
43e426ab9f
Revert "Add no-use-before-define linter rule"
...
This reverts commit fdcc5d68a2 .
Unfortunately, this requires us to move exports to the bottom.
This in turn causes circular dep issues and also access of
exports.GLOBAL_VAR in the global context
2025-10-08 21:17:52 +02:00
Girish Ramakrishnan
505c71855e
retry download only 3 times
2025-10-07 20:42:04 +02:00
Girish Ramakrishnan
ac7c32ad4c
backups: log encryption and format in upload
2025-10-07 17:42:51 +02:00
Girish Ramakrishnan
832eca2d9c
backup size: display stats correctly
2025-10-01 17:43:27 +02:00
Girish Ramakrishnan
c5b7264f1a
rename backupTargets to backupSites
2025-09-12 10:32:37 +02:00
Girish Ramakrishnan
31df40a841
storage: add copyDir
...
we changed listDir in c44863a9bb to list
a directory . this broke copy for files since a '/' is added when listing
the file.
2025-08-26 00:01:14 +02:00
Girish Ramakrishnan
1e4df539b7
improve the logs
2025-08-25 19:15:08 +02:00
Girish Ramakrishnan
20b75b4065
rsync: integrity check
2025-08-16 19:29:59 +05:30
Girish Ramakrishnan
19682ec21b
tgz: integrity check
2025-08-15 21:23:39 +05:30
Girish Ramakrishnan
e7fb444bb3
backuptask: save backupinfo in one place
2025-08-15 14:33:31 +05:30
Girish Ramakrishnan
12e073e8cf
use node: prefix for requires
...
mostly because code is being autogenerated by all the AI stuff using
this prefix. it's also used in the stack trace.
2025-08-14 12:55:35 +05:30
Girish Ramakrishnan
2607ad2e24
rsync: add fileCount to stats and fix integrity collection
2025-08-14 10:05:13 +05:30
Girish Ramakrishnan
d7b5d1f947
rename .checksum to .backupinfo
2025-08-13 21:29:41 +05:30
Girish Ramakrishnan
0c79dcdf1b
tgz: add fileCount to integrity
2025-08-13 19:56:21 +05:30
Girish Ramakrishnan
cb1bc6cfdf
tgz: add fileCount to stats
2025-08-13 19:56:21 +05:30
Girish Ramakrishnan
b5c9f034ca
Use hash stream instead of crypto.createHash
...
crypto.createHash is a write stream but not a PassThrough stream!
2025-08-13 18:48:22 +05:30
Girish Ramakrishnan
0911de205f
stringify the Map correctly
2025-08-13 17:21:46 +05:30
Girish Ramakrishnan
59b428f24b
decrease the JSON indent
2025-08-13 15:55:00 +05:30
Girish Ramakrishnan
54e8395789
add missing require
2025-08-13 15:25:23 +05:30
Girish Ramakrishnan
2fabfbe8f6
rsync: add integrity information
2025-08-13 14:43:05 +05:30
Girish Ramakrishnan
28ac9e153e
rsync: make processSyncerChange a local function
2025-08-13 09:09:48 +05:30
Girish Ramakrishnan
dadbf1de90
tgz: save integrity information as a Map
...
just for consistency because rsync will use a Map
2025-08-13 08:39:03 +05:30
Girish Ramakrishnan
2e16dd983f
backups: stash the stats to the backups table
2025-08-12 20:21:54 +05:30
Girish Ramakrishnan
47fc9561ab
backups (tgz): save integrity information
...
we generate a signing key pair for each target. Initially, I had this
as global. We needed a route to return the public key and putting it
under backup target seemed natural. Since we delete the backups when
we delete a target, we lose all the signing hashes. So, it's fine to lose
the key pair on target delete.
2025-08-12 19:00:29 +05:30
Girish Ramakrishnan
5992658164
restore: fix restore
2025-08-05 14:38:12 +02:00
Girish Ramakrishnan
4fcaae8053
backup: fix listDir to return path instead of fullPath
2025-08-02 10:24:51 +02:00
Girish Ramakrishnan
c935744f4c
backups: root ~~canal~~ path surgery
...
remove rootPath and getBackupFilePath from the backup target and
make this backend specific.
2025-08-02 10:15:34 +02:00
Girish Ramakrishnan
3cabbc1328
backupformat: getFileExtension
2025-08-01 22:58:26 +02:00
Girish Ramakrishnan
7192439b2c
no need for format specific getBackupFilePath
2025-08-01 20:49:11 +02:00
Girish Ramakrishnan
ff6cbf6628
backups: encode extension into the remotePath
2025-08-01 20:42:12 +02:00
Girish Ramakrishnan
ea419509f1
backups: add setup/teardown
...
1. add setup, teardown hooks
2. move the managed mount setup and teardown to filesystem backend
3. remove this vague storage.js
we should convert storageApi into a real object, so we don't have to
keep passing apiConfig around
2025-08-01 15:36:25 +02:00
Girish Ramakrishnan
ae3a34287a
backup target: create snapshot and cache files per target
...
snapshot file tracks the snapshot directory. when app gets deleted,
the cleaner will remove the upstream snapshot directory when it runs.
cache files are used in rsync logic to track what was uploading into
snapshot in the previous run without needing to rescan upstream.
2025-07-30 11:44:42 +02:00
Girish Ramakrishnan
5be03c7ab5
backups: fix app restore with rsync
2025-07-25 13:49:37 +02:00
Girish Ramakrishnan
3aafbd2ccb
backups: add backup multiple targets
2025-07-25 01:30:27 +02:00