braidfs 0.0.134 → 0.0.136

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 +50 -9
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -604,6 +604,12 @@ function sync_url(url) {
604
604
 
605
605
  self.file_mtimeNs_str = '' + stat.mtimeNs
606
606
  await save_meta()
607
+ if (freed) return
608
+
609
+ if (self.file_read_only !== null && await is_read_only(fullpath) !== self.file_read_only) {
610
+ if (freed) return
611
+ await set_read_only(fullpath, self.file_read_only)
612
+ }
607
613
  } catch (e) {
608
614
  if (e.code === 'ENOENT') return null
609
615
  throw e
@@ -648,11 +654,23 @@ function sync_url(url) {
648
654
  ...(x => x && { Cookie: x })(config.cookies?.[new URL(url).hostname])
649
655
  },
650
656
  on_pre_connect: () => reconnect_rate_limiter.get_turn(url),
651
- on_res: res => {
657
+ on_res: async res => {
652
658
  if (freed) return
653
659
  reconnect_rate_limiter.on_conn(url)
654
660
  self.file_read_only = res.headers.get('editable') === 'false'
655
661
  console.log(`connected to ${url}${self.file_read_only ? ' (readonly)' : ''}`)
662
+
663
+ await within_fiber(fullpath, async () => {
664
+ var fullpath = await get_fullpath()
665
+ if (freed) return
666
+
667
+ try {
668
+ if (await is_read_only(fullpath) !== self.file_read_only) {
669
+ if (freed) return
670
+ await set_read_only(fullpath, self.file_read_only)
671
+ }
672
+ } catch (e) {}
673
+ })
656
674
  },
657
675
  on_unauthorized: async () => {
658
676
  console.log(`access denied: reverting local edits`)
@@ -1156,24 +1174,41 @@ function ReconnectRateLimiter(get_wait_time) {
1156
1174
  async function fetch_http2(url, options = {}) {
1157
1175
  if (!fetch_http2.sessions) {
1158
1176
  fetch_http2.sessions = new Map()
1159
- process.on("exit", () => fetch_http2.sessions.forEach(s => s.close()))
1177
+ process.on("exit", () => fetch_http2.sessions.forEach(s => s.session.close()))
1160
1178
  }
1161
1179
 
1162
1180
  var u = new URL(url)
1163
1181
  if (u.protocol !== "https:") return fetch(url, options)
1164
1182
 
1165
1183
  try {
1166
- var session = fetch_http2.sessions.get(u.origin)
1167
- if (!session || session.closed) {
1168
- session = require("http2").connect(u.origin, {
1184
+ var sessionInfo = fetch_http2.sessions.get(u.origin)
1185
+ if (!sessionInfo || sessionInfo.session.closed) {
1186
+ var session = require("http2").connect(u.origin, {
1169
1187
  rejectUnauthorized: options.rejectUnauthorized !== false,
1170
1188
  })
1171
- session.on("error", () => fetch_http2.sessions.delete(u.origin))
1172
- session.on("close", () => fetch_http2.sessions.delete(u.origin))
1173
- fetch_http2.sessions.set(u.origin, session)
1189
+ sessionInfo = { session, pendingRejects: new Set() }
1190
+
1191
+ session.on("error", (e) => {
1192
+ for (var f of sessionInfo.pendingRejects) f(e)
1193
+ fetch_http2.sessions.delete(u.origin)
1194
+ })
1195
+ session.on("close", () => {
1196
+ var e = new Error('Session closed')
1197
+ for (var f of sessionInfo.pendingRejects) f(e)
1198
+ fetch_http2.sessions.delete(u.origin)
1199
+ })
1200
+ fetch_http2.sessions.set(u.origin, sessionInfo)
1174
1201
  }
1175
1202
 
1203
+ var session = sessionInfo.session
1204
+
1176
1205
  return await new Promise((resolve, reject) => {
1206
+ sessionInfo.pendingRejects.add(reject)
1207
+
1208
+ var responseTimeout = setTimeout(() => {
1209
+ stream.destroy(new Error('Response timeout'))
1210
+ }, options.responseTimeout || 10000)
1211
+
1177
1212
  var stream = session.request({
1178
1213
  ":method": options.method || "GET",
1179
1214
  ":path": u.pathname + u.search,
@@ -1187,6 +1222,8 @@ async function fetch_http2(url, options = {}) {
1187
1222
  { once: true })
1188
1223
 
1189
1224
  stream.on("response", headers => {
1225
+ clearTimeout(responseTimeout)
1226
+ sessionInfo.pendingRejects.delete(reject)
1190
1227
  var status = +headers[":status"]
1191
1228
  resolve({
1192
1229
  ok: status >= 200 && status < 300,
@@ -1225,7 +1262,11 @@ async function fetch_http2(url, options = {}) {
1225
1262
  })
1226
1263
  })
1227
1264
 
1228
- stream.on("error", reject)
1265
+ stream.on("error", (err) => {
1266
+ clearTimeout(responseTimeout)
1267
+ sessionInfo.pendingRejects.delete(reject)
1268
+ reject(err)
1269
+ })
1229
1270
 
1230
1271
  var body = options.body
1231
1272
  if (!body) return stream.end()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braidfs",
3
- "version": "0.0.134",
3
+ "version": "0.0.136",
4
4
  "description": "braid technology synchronizing files and webpages",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidfs",