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.
- package/index.js +90 -22
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1532
|
-
|
|
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
|
}
|