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.
Files changed (2) hide show
  1. package/index.js +55 -46
  2. 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
- if (require('fs').existsSync(sync_base)) {
47
- try {
48
- config = require('fs').readFileSync(braidfs_config_file, 'utf8')
49
- } catch (e) { return console.log(`could not find config file: ${braidfs_config_file}`) }
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
- // for 0.0.55 users upgrading to 0.0.56,
55
- // which changes the config "domains" key to "cookies",
56
- // and condenses its structure a bit
57
- if (config.domains) {
58
- config.cookies = Object.fromEntries(Object.entries(config.domains).map(([k, v]) => {
59
- if (v.auth_headers?.Cookie) return [k, v.auth_headers.Cookie]
60
- }).filter(x => x))
61
- delete config.domains
62
- require('fs').writeFileSync(braidfs_config_file, JSON.stringify(config, null, 4))
63
- }
64
- } else {
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
- require('fs').mkdirSync(braidfs_config_dir, { recursive: true })
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
- require('fs').mkdirSync(sync_base_meta, { recursive: true })
78
- require('fs').mkdirSync(trash, { recursive: true })
79
- require('fs').mkdirSync(temp_folder, { recursive: true })
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 require('fs').promises.writeFile(meta_path, JSON.stringify({
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, { encoding: 'utf8' })
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 temp = `${temp_folder}/${Math.random().toString(36).slice(2)}`
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(require('fs').promises.writeFile(meta_path, JSON.stringify({
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(require('fs').promises.writeFile(fullpath, self.file_last_text))
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(require('fs').promises.writeFile(fullpath, self.file_last_text))
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(get_wait_time) {
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() + get_wait_time()) {
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() + get_wait_time() - now))
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.138",
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.85",
10
- "braid-text": "~0.2.99",
11
- "braid-blob": "~0.0.46",
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": {