diff --git a/file/file.ts b/file/file.ts index 3e1982316b..c2708c1d2c 100644 --- a/file/file.ts +++ b/file/file.ts @@ -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() @@ -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(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 )