Skip to content

Commit

Permalink
$mol_file refactor 2
Browse files Browse the repository at this point in the history
  • Loading branch information
zerkalica committed Nov 11, 2024
1 parent 43d18f6 commit 498bbdf
Showing 1 changed file with 41 additions and 20 deletions.
61 changes: 41 additions & 20 deletions file/file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,21 @@ namespace $ {

for (const file of this.added) {
const parent = file.parent()
if ($mol_wire_probe(() => parent.sub())) parent.sub(null)
if (! $mol_wire_probe(() => parent.sub())) continue

try {
parent.sub(null)
} catch (error) {
if ($mol_fail_catch(error)) $mol_fail_log(error)
}
}

for (const file of this.changed) {
file.reset()
try {
file.reset()
} catch (error) {
if ($mol_fail_catch(error)) $mol_fail_log(error)
}
}

this.added.clear()
Expand All @@ -124,32 +134,43 @@ namespace $ {

protected static watching = true
protected static lock = new $mol_lock

@ $mol_action
protected static watching_off(path: string) {
this.watching = false
/*
watch запаздывает и событие может прилететь через 3 сек после окончания сайд эффекта
поэтому добавляем папку, которую меняет side_effect
Когда дойдет до выполнения flush, он ресетнет ее
Иначе будут лишние срабатывания
Например, удалили hyoo/board, watch ресетит и exists начинает отдавать fale, срабатывает git clone
Сразу после него событие addDir еще не успело прийти,
на следующем перезапуске вызывается git pull, т.к.
с точки зрения реактивной системы hyoo/board еще не существует
*/
this.changed.add(this.$.$mol_file.absolute(path))
}

// @ $mol_action
static watch_off<Result>(side_effect: () => Result, affected_dir: string) {
this.watching = false
let done = false

this.watching_off(affected_dir)
// ждем, пока выполнится предыдущий watch_off
const unlock = this.lock.grab()

let result
try {
const result = side_effect()
// watch запаздывает и событие может прилететь через 3 сек после окончания сайд эффекта
// поэтому добавляем папку, которую меняет side_effect в changed для ресета в flush
this.changed.add(this.$.$mol_file.absolute(affected_dir))
done = true
this.flush()
unlock()
return result
result = side_effect()
} catch(e) {
if (! $mol_promise_like(e)) {
if (! done) this.flush()
unlock()
}
$mol_fail_hidden(e)
if ($mol_promise_like(e)) $mol_fail_hidden(e)
else result = e instanceof Error ? e : new Error(String(e), { cause: e })
}
}

this.flush()
unlock()

if (result instanceof Error) $mol_fail_hidden(result)
return result
}

reset() {
this.stat( null )
Expand Down

0 comments on commit 498bbdf

Please sign in to comment.