braidfs 0.0.121 → 0.0.122

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 +90 -22
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -476,6 +476,20 @@ async function sync_url(url) {
476
476
 
477
477
  if (!self.peer) self.peer = Math.random().toString(36).slice(2)
478
478
 
479
+ // create file if it doesn't exist
480
+ var fullpath = await get_fullpath()
481
+ if (freed) return
482
+ if (!(await file_exists(fullpath))) {
483
+ if (freed) return
484
+ await wait_on(require('fs').promises.writeFile(fullpath, ''))
485
+ if (freed) return
486
+ var stat = await require('fs').promises.stat(fullpath, { bigint: true })
487
+ if (freed) return
488
+ self.file_mtimeNs_str = '' + stat.mtimeNs
489
+ self.last_touch = Date.now()
490
+ }
491
+ if (freed) return
492
+
479
493
  await save_meta()
480
494
  })
481
495
  if (freed) return
@@ -531,7 +545,7 @@ async function sync_url(url) {
531
545
  subscribe: true,
532
546
  heartbeats: 120,
533
547
  peer: self.peer,
534
- ...(self.version != null ? {parents: ['' + self.version]} : {})
548
+ parents: self.version != null ? ['' + self.version] : []
535
549
  })
536
550
  if (freed || closed) return
537
551
 
@@ -540,7 +554,16 @@ async function sync_url(url) {
540
554
  if (res.status !== 209)
541
555
  return log_error(`Can't sync ${url} -- got bad response ${res.status} from server (expected 209)`)
542
556
 
543
- console.log(`connected to ${url}${res.headers.get('editable') !== 'true' ? ' (readonly)' : ''}`)
557
+ self.file_read_only = res.headers.get('editable') === 'false'
558
+
559
+ await wait_on(within_fiber(url, async () => {
560
+ var fullpath = await get_fullpath()
561
+ if (freed || closed) return
562
+
563
+ await set_read_only(fullpath, self.file_read_only)
564
+ }))
565
+
566
+ console.log(`connected to ${url}${self.file_read_only ? ' (readonly)' : ''}`)
544
567
 
545
568
  reconnect_rate_limiter.on_conn(url)
546
569
 
@@ -559,8 +582,12 @@ async function sync_url(url) {
559
582
  var fullpath = await get_fullpath()
560
583
  if (freed || closed) return
561
584
 
585
+ await wait_on(set_read_only(fullpath, false))
586
+ if (freed || closed) return
562
587
  await wait_on(require('fs').promises.writeFile(fullpath, update.body))
563
588
  if (freed || closed) return
589
+ await wait_on(set_read_only(fullpath, self.file_read_only))
590
+ if (freed || closed) return
564
591
 
565
592
  var stat = await require('fs').promises.stat(fullpath, { bigint: true })
566
593
  if (freed || closed) return
@@ -571,6 +598,55 @@ async function sync_url(url) {
571
598
  })
572
599
  }, retry)
573
600
 
601
+ async function send_file(fullpath) {
602
+ var body = await require('fs').promises.readFile(fullpath)
603
+ if (freed || closed) return
604
+
605
+ try {
606
+ var a = new AbortController()
607
+ aborts.add(a)
608
+ var r = await braid_fetch(url, {
609
+ method: 'PUT',
610
+ signal: a.signal,
611
+ version: ['' + self.version],
612
+ body,
613
+ headers: {
614
+ ...(x => x && {Cookie: x})(config.cookies?.[new URL(url).hostname])
615
+ },
616
+ })
617
+ if (freed || closed) return
618
+
619
+ // if we're not authorized,
620
+ if (r.status == 401 || r.status == 403) {
621
+ // then revert it
622
+ console.log(`access denied: reverting local edits`)
623
+ unsync_url(url)
624
+ sync_url(url)
625
+ } else if (!r.ok) {
626
+ retry(new Error(`unexpected PUT status: ${r.status}`))
627
+ }
628
+ } catch (e) { retry(e) }
629
+ }
630
+
631
+ // if what we have now is newer than what the server has,
632
+ // go ahead and send it
633
+ await within_fiber(url, async () => {
634
+ if (freed || closed) return
635
+ var fullpath = await get_fullpath()
636
+ if (freed || closed) return
637
+ try {
638
+ var stat = await require('fs').promises.stat(fullpath, { bigint: true })
639
+ } catch (e) { return }
640
+ if (freed || closed) return
641
+
642
+ var server_v = JSON.parse(`[${res.headers.get('current-version')}]`)
643
+ if (self.version != null &&
644
+ '' + stat.mtimeNs === self.file_mtimeNs_str && (
645
+ !server_v.length ||
646
+ 1*server_v[0] < self.version
647
+ )) await send_file(fullpath)
648
+ })
649
+
574
650
  self.signal_file_needs_reading = () => {
575
651
  within_fiber(url, async () => {
576
652
  if (freed || closed) return
@@ -591,22 +667,7 @@ async function sync_url(url) {
591
667
  self.last_touch = Date.now()
592
668
 
593
669
  await save_meta()
594
-
595
- var body = await require('fs').promises.readFile(fullpath)
596
- if (freed || closed) return
597
-
598
- var a = new AbortController()
599
- aborts.add(a)
600
-
601
- await braid_fetch(url, {
602
- method: 'PUT',
603
- signal: a.signal,
604
- version: ['' + self.version],
605
- body,
606
- headers: {
607
- ...(x => x && {Cookie: x})(config.cookies?.[new URL(url).hostname])
608
- },
609
- })
670
+ await send_file(fullpath)
610
671
  }
611
672
  })
612
673
  }
@@ -1107,12 +1168,12 @@ async function sync_url(url) {
1107
1168
  if (res.status !== 209)
1108
1169
  return log_error(`Can't sync ${url} -- got bad response ${res.status} from server (expected 209)`)
1109
1170
 
1110
- console.log(`connected to ${url}${res.headers.get('editable') !== 'true' ? ' (readonly)' : ''}`)
1111
-
1112
1171
  reconnect_rate_limiter.on_conn(url)
1113
1172
 
1114
1173
  self.file_read_only = res.headers.get('editable') === 'false'
1115
1174
  self.signal_file_needs_writing()
1175
+
1176
+ console.log(`connected to ${url}${self.file_read_only ? ' (readonly)' : ''}`)
1116
1177
 
1117
1178
  initial_connect_done()
1118
1179
  res.subscribe(async update => {
@@ -1528,8 +1589,15 @@ async function set_read_only(fullpath, read_only) {
1528
1589
  })
1529
1590
  } else {
1530
1591
  let mode = (await require('fs').promises.stat(fullpath)).mode
1531
- if (read_only) mode &= ~0o222
1532
- else mode |= 0o200
1592
+
1593
+ // Check if chmod is actually needed
1594
+ if (read_only && (mode & 0o222) === 0) return
1595
+ if (!read_only && (mode & 0o200) !== 0) return
1596
+
1597
+ // Perform chmod only if necessary
1598
+ if (read_only) mode &= ~0o222 // Remove all write permissions
1599
+ else mode |= 0o200 // Add owner write permission
1600
+
1533
1601
  await require('fs').promises.chmod(fullpath, mode)
1534
1602
  }
1535
1603
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braidfs",
3
- "version": "0.0.121",
3
+ "version": "0.0.122",
4
4
  "description": "braid technology synchronizing files and webpages",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidfs",