braidfs 0.0.138 → 0.0.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +55 -46
- package/package.json +4 -4
package/index.js
CHANGED
|
@@ -39,44 +39,49 @@ var temp_folder = `${braidfs_config_dir}/temp`
|
|
|
39
39
|
var investigating_disconnects_log = `${braidfs_config_dir}/investigating_disconnects.log`
|
|
40
40
|
|
|
41
41
|
var config = null,
|
|
42
|
-
watcher_misses = 0
|
|
43
|
-
reconnect_rate_limiter = new ReconnectRateLimiter(() =>
|
|
44
|
-
config?.reconnect_delay_ms ?? 3000)
|
|
42
|
+
watcher_misses = 0
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
require('fs').mkdirSync(braidfs_config_dir, { recursive: true })
|
|
45
|
+
require('fs').mkdirSync(sync_base_meta, { recursive: true })
|
|
46
|
+
require('fs').mkdirSync(trash, { recursive: true })
|
|
47
|
+
require('fs').mkdirSync(temp_folder, { recursive: true })
|
|
48
|
+
|
|
49
|
+
// Clear out temp folder
|
|
50
|
+
for (let f of require('fs').readdirSync(temp_folder))
|
|
51
|
+
require('fs').unlinkSync(`${temp_folder}/${f}`)
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
config = require('fs').readFileSync(braidfs_config_file, 'utf8')
|
|
50
55
|
try {
|
|
51
56
|
config = JSON.parse(config)
|
|
52
|
-
} catch (e) { return console.log(`could not parse config file: ${braidfs_config_file}`) }
|
|
53
57
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
58
|
+
// for 0.0.55 users upgrading to 0.0.56,
|
|
59
|
+
// which changes the config "domains" key to "cookies",
|
|
60
|
+
// and condenses its structure a bit
|
|
61
|
+
if (config.domains) {
|
|
62
|
+
config.cookies = Object.fromEntries(Object.entries(config.domains).map(([k, v]) => {
|
|
63
|
+
if (v.auth_headers?.Cookie) return [k, v.auth_headers.Cookie]
|
|
64
|
+
}).filter(x => x))
|
|
65
|
+
delete config.domains
|
|
66
|
+
atomic_write_sync(braidfs_config_file, JSON.stringify(config, null, 4), temp_folder)
|
|
67
|
+
}
|
|
68
|
+
} catch (e) { return console.log(`could not parse config file: ${braidfs_config_file}`) }
|
|
69
|
+
} catch (e) {
|
|
65
70
|
config = {
|
|
66
71
|
sync: {},
|
|
67
72
|
cookies: { 'example.com': 'secret_pass' },
|
|
68
73
|
port: 45678,
|
|
69
74
|
scan_interval_ms: 1000 * 20,
|
|
70
75
|
reconnect_delay_ms: 1000 * 3,
|
|
71
|
-
retry_delay_ms: 1000,
|
|
72
76
|
}
|
|
73
|
-
|
|
74
|
-
require('fs').writeFileSync(braidfs_config_file, JSON.stringify(config, null, 4))
|
|
77
|
+
atomic_write_sync(braidfs_config_file, JSON.stringify(config, null, 4), temp_folder)
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
var reconnect_rate_limiter = new ReconnectRateLimiter(config.reconnect_delay_ms ?? 3000)
|
|
81
|
+
if (config.reconnect_delay_ms) {
|
|
82
|
+
braid_fetch.reconnect_delay_ms = config.reconnect_delay_ms
|
|
83
|
+
braid_blob.reconnect_delay_ms = config.reconnect_delay_ms
|
|
84
|
+
}
|
|
80
85
|
|
|
81
86
|
// DEBUGGING HACK ID: L04LPFHQ1M -- INVESTIGATING DISCONNECTS
|
|
82
87
|
require('fs').appendFileSync(investigating_disconnects_log, `${Date.now()} -- braidfs starting\n`)
|
|
@@ -511,8 +516,6 @@ function sync_url(url) {
|
|
|
511
516
|
// version needed to force Merge-Type return header
|
|
512
517
|
version: [],
|
|
513
518
|
headers: {
|
|
514
|
-
// needed for braid.org routing
|
|
515
|
-
Accept: 'text/plain',
|
|
516
519
|
// in case it supports dt, so it doesn't give us "simpleton"
|
|
517
520
|
'Merge-Type': 'dt',
|
|
518
521
|
}
|
|
@@ -541,11 +544,11 @@ function sync_url(url) {
|
|
|
541
544
|
console.log(`init_binary_sync: ${url}`)
|
|
542
545
|
|
|
543
546
|
async function save_meta() {
|
|
544
|
-
await
|
|
547
|
+
await atomic_write(meta_path, JSON.stringify({
|
|
545
548
|
merge_type: self.merge_type,
|
|
546
549
|
peer: self.peer,
|
|
547
550
|
file_mtimeNs_str: self.file_mtimeNs_str
|
|
548
|
-
}))
|
|
551
|
+
}), temp_folder)
|
|
549
552
|
}
|
|
550
553
|
|
|
551
554
|
self.file_mtimeNs_str = null
|
|
@@ -574,7 +577,7 @@ function sync_url(url) {
|
|
|
574
577
|
if (self.ac.signal.aborted) return
|
|
575
578
|
|
|
576
579
|
if (self.file_mtimeNs_str !== '' + stat.mtimeNs) {
|
|
577
|
-
var data = await require('fs').promises.readFile(fullpath
|
|
580
|
+
var data = await require('fs').promises.readFile(fullpath)
|
|
578
581
|
if (self.ac.signal.aborted) return
|
|
579
582
|
|
|
580
583
|
await braid_blob.put(url, data, { skip_write: true })
|
|
@@ -610,14 +613,7 @@ function sync_url(url) {
|
|
|
610
613
|
if (self.ac.signal.aborted) return
|
|
611
614
|
|
|
612
615
|
try {
|
|
613
|
-
var
|
|
614
|
-
await require('fs').promises.writeFile(temp, data)
|
|
615
|
-
if (self.ac.signal.aborted) return
|
|
616
|
-
|
|
617
|
-
var stat = await require('fs').promises.stat(temp, { bigint: true })
|
|
618
|
-
if (self.ac.signal.aborted) return
|
|
619
|
-
|
|
620
|
-
await require('fs').promises.rename(temp, fullpath)
|
|
616
|
+
var stat = await atomic_write(fullpath, data, temp_folder)
|
|
621
617
|
if (self.ac.signal.aborted) return
|
|
622
618
|
|
|
623
619
|
self.file_mtimeNs_str = '' + stat.mtimeNs
|
|
@@ -668,7 +664,6 @@ function sync_url(url) {
|
|
|
668
664
|
signal: ac.signal,
|
|
669
665
|
peer: self.peer,
|
|
670
666
|
headers: {
|
|
671
|
-
'Content-Type': 'text/plain',
|
|
672
667
|
...(x => x && { Cookie: x })(config.cookies?.[new URL(url).hostname])
|
|
673
668
|
},
|
|
674
669
|
on_pre_connect: () => reconnect_rate_limiter.get_turn(url),
|
|
@@ -865,13 +860,13 @@ function sync_url(url) {
|
|
|
865
860
|
while (file_needs_reading || file_needs_writing) {
|
|
866
861
|
async function write_meta_file() {
|
|
867
862
|
if (self.ac.signal.aborted) return
|
|
868
|
-
await wait_on(
|
|
863
|
+
await wait_on(atomic_write(meta_path, JSON.stringify({
|
|
869
864
|
merge_type: self.merge_type,
|
|
870
865
|
version: file_last_version,
|
|
871
866
|
digest: sha256(self.file_last_text),
|
|
872
867
|
peer: self.peer,
|
|
873
868
|
local_edit_counter: self.local_edit_counter
|
|
874
|
-
})))
|
|
869
|
+
}), temp_folder))
|
|
875
870
|
}
|
|
876
871
|
|
|
877
872
|
if (file_needs_reading) {
|
|
@@ -889,7 +884,7 @@ function sync_url(url) {
|
|
|
889
884
|
file_last_version = []
|
|
890
885
|
self.file_last_text = ''
|
|
891
886
|
|
|
892
|
-
await wait_on(
|
|
887
|
+
await wait_on(atomic_write(fullpath, self.file_last_text, temp_folder))
|
|
893
888
|
}
|
|
894
889
|
if (self.ac.signal.aborted) return
|
|
895
890
|
|
|
@@ -969,7 +964,7 @@ function sync_url(url) {
|
|
|
969
964
|
file_last_version = version
|
|
970
965
|
self.file_last_text = body
|
|
971
966
|
self.last_touch = Date.now()
|
|
972
|
-
await wait_on(
|
|
967
|
+
await wait_on(atomic_write(fullpath, self.file_last_text, temp_folder))
|
|
973
968
|
if (self.ac.signal.aborted) return
|
|
974
969
|
}
|
|
975
970
|
|
|
@@ -1109,7 +1104,7 @@ async function ensure_path(path) {
|
|
|
1109
1104
|
}
|
|
1110
1105
|
}
|
|
1111
1106
|
|
|
1112
|
-
function ReconnectRateLimiter(
|
|
1107
|
+
function ReconnectRateLimiter(wait_time) {
|
|
1113
1108
|
var self = {}
|
|
1114
1109
|
|
|
1115
1110
|
self.conns = new Map() // Map<host, Set<url>>
|
|
@@ -1126,7 +1121,7 @@ function ReconnectRateLimiter(get_wait_time) {
|
|
|
1126
1121
|
var now = Date.now()
|
|
1127
1122
|
var my_last_turn = () => self.conns.size === 0 ? self.last_turn : self.qs[0].last_turn
|
|
1128
1123
|
|
|
1129
|
-
while (self.qs.length && now >= my_last_turn() +
|
|
1124
|
+
while (self.qs.length && now >= my_last_turn() + wait_time) {
|
|
1130
1125
|
var x = self.qs.shift()
|
|
1131
1126
|
if (!x.turns.length) {
|
|
1132
1127
|
self.host_to_q.delete(x.host)
|
|
@@ -1140,7 +1135,7 @@ function ReconnectRateLimiter(get_wait_time) {
|
|
|
1140
1135
|
|
|
1141
1136
|
if (self.qs.length)
|
|
1142
1137
|
self.timer = setTimeout(process, Math.max(0,
|
|
1143
|
-
my_last_turn() +
|
|
1138
|
+
my_last_turn() + wait_time - now))
|
|
1144
1139
|
}
|
|
1145
1140
|
|
|
1146
1141
|
self.get_turn = async (url) => {
|
|
@@ -1449,6 +1444,20 @@ function sha256(x) {
|
|
|
1449
1444
|
return require('crypto').createHash('sha256').update(x).digest('base64')
|
|
1450
1445
|
}
|
|
1451
1446
|
|
|
1447
|
+
async function atomic_write(final_destination, data, temp_folder) {
|
|
1448
|
+
var temp = `${temp_folder}/${Math.random().toString(36).slice(2)}`
|
|
1449
|
+
await require('fs').promises.writeFile(temp, data)
|
|
1450
|
+
var stat = await require('fs').promises.stat(temp, { bigint: true })
|
|
1451
|
+
await require('fs').promises.rename(temp, final_destination)
|
|
1452
|
+
return stat
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
function atomic_write_sync(final_destination, data, temp_folder) {
|
|
1456
|
+
var temp = `${temp_folder}/${Math.random().toString(36).slice(2)}`
|
|
1457
|
+
require('fs').writeFileSync(temp, data)
|
|
1458
|
+
require('fs').renameSync(temp, final_destination)
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1452
1461
|
function is_well_formed_absolute_url(urlString) {
|
|
1453
1462
|
if (!urlString || typeof urlString !== 'string') return
|
|
1454
1463
|
if (urlString.match(/\s/)) return
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "braidfs",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.142",
|
|
4
4
|
"description": "braid technology synchronizing files and webpages",
|
|
5
5
|
"author": "Braid Working Group",
|
|
6
6
|
"repository": "braid-org/braidfs",
|
|
7
7
|
"homepage": "https://braid.org",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"braid-http": "~1.3.
|
|
10
|
-
"braid-text": "~0.2.
|
|
11
|
-
"braid-blob": "~0.0.
|
|
9
|
+
"braid-http": "~1.3.86",
|
|
10
|
+
"braid-text": "~0.2.103",
|
|
11
|
+
"braid-blob": "~0.0.49",
|
|
12
12
|
"chokidar": "^4.0.3"
|
|
13
13
|
},
|
|
14
14
|
"bin": {
|